hibernate数据类型_Hibernate类型初学者指南
hibernate数据类型
基本映射概念
学习Hibernate时,许多人喜欢跳到父子关联,而无需掌握对象关系映射的基础知识。 在开始对实体关联进行建模之前,了解各个实体的基本映射规则非常重要。
Hibernate类型
Hibernate类型是SQL类型和Java原语/对象类型之间的桥梁。
这些是Hibernate默认支持的类型:
Hibernate类型(org.hibernate.type) | JDBC类型 | Java类型 |
---|---|---|
StringType | VARCHAR | 串 |
物化球 | CLOB | 串 |
文字类型 | LONGVARCHAR | 串 |
角色类型 | 焦炭 | 字符或字符 |
布尔型 | 比特 | 布尔值还是布尔值 |
NumericBooleanType | 整数(例如0 =假和1 =真) | 布尔值还是布尔值 |
是否类型 | CHAR(例如,“ N”或“ n” = false,“ Y”或“ y” = true) | 布尔值还是布尔值 |
TrueFalseType | CHAR(例如,“ F”或“ f” =否,“ T”或“ t” =真) | 布尔值还是布尔值 |
字节类型 | 天音 | 字节或字节 |
短型 | 小灵通 | 短或短 |
整数类型 | 整数 | 整数或整数 |
长型 | 比金特 | 长或长 |
浮动类型 | 浮动 | 浮动或浮动 |
双重类型 | 双 | 双倍或双倍 |
BigIntegerType | 数字 | 大整数 |
BigDecimalType | 数字 | 大十进制 |
时间戳类型 | 时间戳 | java.sql.Timestamp或java.util.Date |
时间类型 | 时间 | java.sql.Time |
日期类型 | 日期 | java.sql.Date |
CalendarType | 时间戳 | java.util.Calendar或java.util.GregorianCalendar |
CalendarType | 日期 | java.util.Calendar或java.util.GregorianCalendar |
货币类型 | VARCHAR | java.util.Currency |
语言环境类型 | VARCHAR | java.util.Locale |
时区类型 | VARCHAR | java.util.TimeZone |
网址类型 | VARCHAR | java.net.URL |
类类型 | VARCHAR | java.lang.Class |
BlobType | BLOB | java.sql.Blob |
ClobType | CLOB | java.sql.Clob |
BinaryType | VARBINARY | 字节[]或字节[] |
BinaryType | BLOB | 字节[]或字节[] |
BinaryType | LONGVARBINARY | 字节[]或字节[] |
BinaryType | LONGVARBINARY | 字节[]或字节[] |
CharArrayType | VARCHAR | char []或Character [] |
UUIDBinaryType | 二进制 | java.util.UUID |
UUIDBinaryType | CHAR或VARCHAR | java.util.UUID |
UUIDBinaryType | PostgreSQL UUID | java.util.UUID |
SerializableType | VARBINARY | 可序列化 |
您将始终可以定义自己的自定义类型,我们将在以后的文章中看到。
嵌入式(aka组件)类型
您可以将多个列分组为特定的Java类型,从而可以在整个域模型中重复使用。 如果映射的Java对象始终依赖于某些外部实体,则可以为此类域模型映射选择Embeddable类型。
一个Embeddable对象可能包含基本类型和关联映射,但永远不能包含@Id。 可嵌入对象及其拥有的实体将被持久保存/删除。
假设我们有下面SQL表:
CREATE TABLE entity_event(id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),entity_class VARCHAR(255),entity_id BIGINT,message VARCHAR(255),PRIMARY KEY (id));
我们可以将entity_class和entity_id分组为一个Embeddable对象,该对象将在两个不同的拥有实体中使用。
Embeddable对象如下所示:
@Embeddable
public class EntityIdentifier implements Serializable {@Column(name = "entity_id", nullable = true)private Long entityId;@Column(name = "entity_class", nullable = true)private Class entityClass;public EntityIdentifier() {}public EntityIdentifier(Class entityClass, Long entityId) {this.entityClass = entityClass;this.entityId = entityId;}public Class getEntityClass() { return entityClass; }public void setEntityClass(Class entityClass) { this.entityClass = entityClass; }public Long getEntityId() { return entityId; }public void setEntityId(Long entityId) { this.entityId = entityId; }
}
关联的Entity表将继承Embeddable属性的关联列。
实体
实体与SQL表行的Java等效。 该实体必须包含一个@Id属性,该属性映射关联的表主键。
应用程序逻辑对实体属性进行更改,并将实体状态更改(持久,合并,删除)通知持久性上下文。 因此,持久性上下文会将所有实体更改转换为SQL语句。
假设我们有以下SQL表:
CREATE TABLE entity_attribute(id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),entity_class VARCHAR(255),entity_id BIGINT,name VARCHAR(255),VALUE VARCHAR(255),PRIMARY KEY (id));CREATE TABLE entity_event(id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),entity_class VARCHAR(255),entity_id BIGINT,message VARCHAR(255),PRIMARY KEY (id));
由于两个表都包含entity_class和entity_id列,因此我们可以使用EntityIdentifier Embeddable类型。
@Entity
@Table(name = "entity_attribute")
public class EntityAttribute {@Id@GeneratedValueprivate Long id;private String name;private String value;private EntityIdentifier entityIdentifier;public Long getId() { return id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public String getValue() { return value; }public void setValue(String value) { this.value = value; }public EntityIdentifier getEntityIdentifier() { return entityIdentifier; }public void setEntityIdentifier(EntityIdentifier entityIdentifier) { this.entityIdentifier = entityIdentifier; }
}@Entity
@Table(name = "entity_event")
public class EntityEvent {@Id@GeneratedValueprivate Long id;private String message;private EntityIdentifier entityIdentifier;public Long getId() { return id; }public String getMessage() { return message; }public void setMessage(String message) { this.message = message; }public EntityIdentifier getEntityIdentifier() { return entityIdentifier; }public void setEntityIdentifier(EntityIdentifier entityIdentifier) { this.entityIdentifier = entityIdentifier; }
}
测试时间
我们将为给定产品创建一个EntityEvent和一个EntityAttribute,以查看Embeddable如何与拥有的实体一起持久保存:
@Test
public void testEntityIdentifier() {doInTransaction(new TransactionCallable<Void>() {@Overridepublic Void execute(Session session) {Product product = new Product("LCD");session.persist(product);EntityEvent productEvent = new EntityEvent();productEvent.setMessage(String.format("Product %s added", product.getName()));productEvent.setEntityIdentifier(new EntityIdentifier(product.getClass(),product.getId()));session.persist(productEvent);EntityAttribute productAttribute = new EntityAttribute();productAttribute.setName("AD_CAMPAIGN");productAttribute.setValue("LCD_Sales");productAttribute.setEntityIdentifier(new EntityIdentifier(product.getClass(),product.getId()));session.persist(productAttribute);assertSame(1, session.createQuery("select ea from EntityAttribute ea where ea.entityIdentifier = :entityIdentifier").setParameter("entityIdentifier", new EntityIdentifier(product.getClass(), product.getId())).list().size());return null;}});
}
Query:{[
INSERT INTO product(id,name)
VALUES (DEFAULT,?)
][LCD]} Query:{[
INSERT INTO entity_event(id,entity_class,entity_id,message)
VALUES (DEFAULT,?,?,?)
][com.vladmihalcea.hibernate.masterclass.laboratory.entityidentifier.Product,1,Product LCD added]} Query:{[
INSERT INTO entity_attribute(id,entity_class,entity_id,name,VALUE)
VALUES (DEFAULT,?,?,?,?)
][com.vladmihalcea.hibernate.masterclass.laboratory.entityidentifier.Product,1,AD_CAMPAIGN,LCD_Sales]} Query:{[
SELECT entityattr0_.id AS id1_0_,entityattr0_.entity_class AS entity_c2_0_,entityattr0_.entity_id AS entity_i3_0_,entityattr0_.name AS name4_0_,entityattr0_.VALUE AS value5_0_
FROM entity_attribute entityattr0_
WHERE entityattr0_.entity_class = ?AND entityattr0_.entity_id = ?
][com.vladmihalcea.hibernate.masterclass.laboratory.entityidentifier.Product,1]}
结论
在了解实体关联之前,我们仍然需要涵盖许多概念。 在跳到更高级的主题之前,您应该始终花一些时间来理解基本概念。 我的下一篇文章将介绍实体标识符和所有可用的生成器技术。
- 代码可在GitHub上获得 。
翻译自: https://www.javacodegeeks.com/2014/06/a-beginners-guide-to-hibernate-types.html
hibernate数据类型
hibernate数据类型_Hibernate类型初学者指南相关推荐
- JavaScript变量和数据类型初学者指南
Scott Molinari , Vildan Softic和Chris Perry同行评审了< JavaScript变量和数据类型初学者指南>. 感谢所有SitePoint的同行评审人员 ...
- mysql映射超_Hibernate的映射类型 hibernate mysql映射类型
(转)http://blog.csdn.net/zxy_snow/article/details/7214222 Hibernate的映射类型 hibernate mysql映射类型 1.Hibern ...
- sql查询初学者指南_面向初学者SQL Server查询执行计划–类型和选项
sql查询初学者指南 When a DBA is working with the SQL Server, he/she might sometimes say that the execution ...
- java初学者指南_企业Java中事务隔离级别的初学者指南
java初学者指南 介绍 基于ACID事务属性的关系数据库强一致性模型. 在本文中,我们将阐明对资源本地事务和JTA事务使用不同的事务隔离级别和各种配置模式的背后原因. 隔离和一致性 在关系数据库系统 ...
- Objective-C初学者指南(第2版)
<Objective-C初学者指南(第2版)> 基本信息 原书名:Objective-C for Absolute Beginners:iPhone, iPad, and Mac Prog ...
- NHibernate初学者指南(15):使用LINQ to NHibernate提供程序查询数据
在前面的<NHibernate初学者指南(8):增删查改>一文中简单的提到了查询一个实体的Get<T>和Load<T>方法以及查询实体列表的Query<T&g ...
- 怎么学习Java编程,Java初学者指南
怎么学习Java编程,Java初学者指南.Java基于C和C++.第一个Java编译器是由Sun Microsystems开发的,是使用C++中的一些库用C编写的.Java文件使用编译器转换为位代码格 ...
- python编程电子书下载-python编程初学者指南
python编程初学者指南全书共12章,内容浅显易懂,书中的每一个章节都会用一个完整的游戏来演示其中的关键知识点,最后都会对该章的知识点进行小结,还会给出一些小练习让你试试身手.东坡小编为大家分享py ...
- python编程入门指南pdf-python编程初学者指南
python编程初学者指南是一本边学边制作游戏的经典教程,由美国程序员道森(Michael Dawson)编著.通过阅读本书,你不仅会学到很多实用的Python编程知识,还将懂得如何在实际工作中运用这 ...
最新文章
- zabbix4.0搭建(基于CentOS6.8)
- 暴力探测蓝牙设备工具redfang
- xshell远程连接自动断开的问题解决
- 大剑无锋之post那么多优点,为什么还用get
- oracle跨越千年处理
- 看完这篇文章,我再也不怕面试官问「垃圾回收」了...
- Linux之crontab命令
- 重启tomcat 脚本
- Exadata的独门武器--卸载(Offloading)
- POJ 1398 Complete the sequence! ★ (差分)
- 手把手编写自己的PHP MVC框架实例教程
- VMware Workstation 12 安装大于4GB的GHOST 64位win7系统
- 计算机图形学上机心得,计算机图形学学习的心得体会
- 91卫图免费版使用步骤
- Python期末考试编程题
- xsmax无法进入dfu模式_iPhoneXS/XSMax如何强制重启?如何进入恢复模式或DFU模式?...
- 京东朱健:聊聊京东广告系统的数据库选型
- 解决win10系统无法安装.Net framework3.5,安装Visual Studio 2010提示你的电脑上的应用需要使用以下Windows功能:.Net framework3.5(包括
- HyperMesh Notes
- DB2 SQLSTATE:428C9,不能将ROWID列指定为INSERT或UPDATE的目标列。