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类型初学者指南相关推荐

  1. JavaScript变量和数据类型初学者指南

    Scott Molinari , Vildan Softic和Chris Perry同行评审了< JavaScript变量和数据类型初学者指南>. 感谢所有SitePoint的同行评审人员 ...

  2. mysql映射超_Hibernate的映射类型 hibernate mysql映射类型

    (转)http://blog.csdn.net/zxy_snow/article/details/7214222 Hibernate的映射类型 hibernate mysql映射类型 1.Hibern ...

  3. sql查询初学者指南_面向初学者SQL Server查询执行计划–类型和选项

    sql查询初学者指南 When a DBA is working with the SQL Server, he/she might sometimes say that the execution ...

  4. java初学者指南_企业Java中事务隔离级别的初学者指南

    java初学者指南 介绍 基于ACID事务属性的关系数据库强一致性模型. 在本文中,我们将阐明对资源本地事务和JTA事务使用不同的事务隔离级别和各种配置模式的背后原因. 隔离和一致性 在关系数据库系统 ...

  5. Objective-C初学者指南(第2版)

    <Objective-C初学者指南(第2版)> 基本信息 原书名:Objective-C for Absolute Beginners:iPhone, iPad, and Mac Prog ...

  6. NHibernate初学者指南(15):使用LINQ to NHibernate提供程序查询数据

    在前面的<NHibernate初学者指南(8):增删查改>一文中简单的提到了查询一个实体的Get<T>和Load<T>方法以及查询实体列表的Query<T&g ...

  7. 怎么学习Java编程,Java初学者指南

    怎么学习Java编程,Java初学者指南.Java基于C和C++.第一个Java编译器是由Sun Microsystems开发的,是使用C++中的一些库用C编写的.Java文件使用编译器转换为位代码格 ...

  8. python编程电子书下载-python编程初学者指南

    python编程初学者指南全书共12章,内容浅显易懂,书中的每一个章节都会用一个完整的游戏来演示其中的关键知识点,最后都会对该章的知识点进行小结,还会给出一些小练习让你试试身手.东坡小编为大家分享py ...

  9. python编程入门指南pdf-python编程初学者指南

    python编程初学者指南是一本边学边制作游戏的经典教程,由美国程序员道森(Michael Dawson)编著.通过阅读本书,你不仅会学到很多实用的Python编程知识,还将懂得如何在实际工作中运用这 ...

最新文章

  1. zabbix4.0搭建(基于CentOS6.8)
  2. 暴力探测蓝牙设备工具redfang
  3. xshell远程连接自动断开的问题解决
  4. 大剑无锋之post那么多优点,为什么还用get
  5. oracle跨越千年处理
  6. 看完这篇文章,我再也不怕面试官问「垃圾回收」了...
  7. Linux之crontab命令
  8. 重启tomcat 脚本
  9. Exadata的独门武器--卸载(Offloading)
  10. POJ 1398 Complete the sequence! ★ (差分)
  11. 手把手编写自己的PHP MVC框架实例教程
  12. VMware Workstation 12 安装大于4GB的GHOST 64位win7系统
  13. 计算机图形学上机心得,计算机图形学学习的心得体会
  14. 91卫图免费版使用步骤
  15. Python期末考试编程题
  16. xsmax无法进入dfu模式_iPhoneXS/XSMax如何强制重启?如何进入恢复模式或DFU模式?...
  17. 京东朱健:聊聊京东广告系统的数据库选型
  18. 解决win10系统无法安装.Net framework3.5,安装Visual Studio 2010提示你的电脑上的应用需要使用以下Windows功能:.Net framework3.5(包括
  19. HyperMesh Notes
  20. DB2 SQLSTATE:428C9,不能将ROWID列指定为INSERT或UPDATE的目标列。

热门文章

  1. 读人人都是产品经理__1
  2. SpringCloud Ribbon(五)之服务实例列表ServerList
  3. 如何让面试官认可你的简历
  4. 57张PPT彻底搞清楚区块链技术。。
  5. 阿里巴巴对Java编程【单元测试】的规约
  6. 史上最全 BAT 大厂面试题整理
  7. laravel构造器的CURD
  8. 《四世同堂》金句摘抄(七)
  9. 如何给视频中插入视频,字幕,以及去掉前后广告
  10. C#实现人脸识别【SqlHelper】