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数据类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速区分单模与多模光纤收发器?

现如今&#xff0c;光纤收发器的应用范围是越来越广泛了&#xff0c;但是市场上大多数品牌的光纤收发器外观都差不多&#xff0c;那么&#xff0c;我们在使用光纤收发器的过程中该如何辨别单模和多模光纤收发器呢&#xff1f;接下来就跟随飞畅科技的小编一起来详细了解下吧&…

什么是HDMI光纤延长器?其应用场合有哪些?

在信号数据传输中&#xff0c;我们常常听到的都是光模块、光纤、光缆等器件&#xff1b;在本文中&#xff0c;杭州飞畅科技给大家介绍的是另外一款数据传输产品——光纤延长器。那么&#xff0c;到底什么是光纤延长器呢&#xff1f;它应用场合有哪些呢&#xff1f;接下来我们就…

Spring与Rails的jQuery UJS

我一直想尝试一下是否可以在Spring Boot项目中使用Rails的jQuery UJS 。 jquery-ujs中的UJS代表不引人注目JavaScript 。 我非常喜欢UJS如何将事件处理程序连接到标记有HTML5 data-*属性的合格DOM元素。 我发现自己希望看到更多在Spring Boot Web应用程序中使用的这种方法。 我…

什么是VGA光纤收发器?

采用先进的非压缩数字高清视频和高速数字光纤传输技术&#xff0c;可以轻松地将计算机主机、高清视频信号源、高清DVD/DVR等设备输出的各种分辨率的VGA高清视频信号长距离传输到远端的器件。那么&#xff0c;VGA光纤收发器的产品特点及技术参数有哪些呢&#xff1f;接下来我们就…

akka使用_使用Akka简化交易系统

akka使用我的同事正在开发一种交易系统&#xff0c;该系统可以处理大量的传入交易。 每笔交易都涵盖一种Instrument &#xff08;例如债券或股票&#xff09;&#xff0c;并且具有某些&#xff08;现在&#xff09;不重要的属性。 他们坚持使用Java&#xff08;<8&#xff0…

浅析HDMI1.4光纤延长器的工作原理和应用领域

HDMI光纤延长器是用来延长信号的传输器件&#xff0c;解决HDMI音视频信号无法远距离传输的问题&#xff0c;且保证信号传输的质量。那么&#xff0c;HDMI光纤延长器的工作原理是什么&#xff1f;HDMI光纤延长器有哪些应用呢&#xff1f;接下来就由飞畅科技的小编来为大家详细介…

Java中的模板方法模式

模板方法模式是一种行为模式&#xff0c;建议在超类中更一般地定义算法。 该算法是在称为模板方法的方法中定义的。 子类仅定义更具体的算法步骤的实现。 使用这种设计模式的好处是&#xff0c;算法后面的任何更改只会影响超类中的代码。 此外&#xff0c;它还可以提高代码的可…

什么是单模单纤/双纤光纤收发器?

光纤收发器&#xff0c;是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元&#xff0c;按其所需主要分为单纤光纤收发器和双纤光纤收发器&#xff0c;接下来我们就来详细介绍下什么是单模单纤/双纤光纤收发器&#xff1f;单模单纤和单模双纤光纤收…

什么是以太网光纤收发器,其产品特点和技术参数都有哪些?

以太网光纤收发器是一款提供以太网数据信号到光纤数据信号的双向透明转换器&#xff0c;可以将以太网信号通过光纤线路传输突破传输距离100米的限制&#xff0c;使得以太网网络覆盖得到极大的延伸。光纤收发器的出现&#xff0c;确保能够顺畅的将电信号与光纤信号相互转换&…

什么是CAN总线中继器?

CAN网桥&#xff08;Bridge&#xff09;是一个智能的中继器。使用CAN网桥对设备进行互连&#xff0c;克服了CAN总线结点个数及通信距离的物理限制&#xff0c;能有效扩充CAN网络的结点总数&#xff0c;延长通信距离。今天&#xff0c;飞畅科技的小编为大家详细介绍下CAN总线中继…

java百里香_百里香Spring测试的意见

java百里香我最近在基于Spring的Web应用程序中转换为thymeleaf以进行视图模板化&#xff0c;而不是jsp。 百里香叶文档中关于为什么百里香叶在jsp上为什么能保持水分的所有争论&#xff0c;我肯定被卖掉了。 除了能够预览模板之外&#xff0c;对我来说&#xff0c;主要原因之一…

一文读懂工业设备的两种通讯方式:现场总线和工业以太网

随着传统制造企业正在加快智能制造转型的进程&#xff0c;工业互联网迅速在全世界范围内兴起。在工业互联网的技术构架中&#xff0c;通过各类通讯方式接入不同设备、系统和产品&#xff0c;来采集海量数据是其重要的一环。本文将重点介绍工业底层设备的两种通讯方式&#xff1…

Java中的中介器设计模式

在本教程中&#xff0c;我们将学习一种行为模式&#xff0c;该行为模式将促进彼此通信的多个对象之间的松散耦合。 Mediator设计模式背后的想法是拥有一个中心对象&#xff0c;该对象封装了一组对象之间的交互方式。 在调解器模式中&#xff0c;我们在称为调解器的单独类中提取…

什么是中国1号信令?

中国1号信令是在电话自动交换网中&#xff0c;我国所用的随路信令的总称&#xff0c;目前在国内长途网和市话中的局间中继线上使用。那么&#xff0c;什么是中国1号信令&#xff1f;中国1号信令的分类又有哪些呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&…

如何选购工业级光模块

大家都知道光模块是影响整个网络性能的关键因素&#xff0c;特别是在工业以太网中&#xff0c;网络连接控制的多为大型工业设备&#xff0c;光模块的稳定性尤为重要&#xff0c;那么&#xff0c;我们该如何选购工业级光模块呢&#xff1f;接下来就由飞畅科技的小编来为大家详细…

ejb生命周期_无状态EJB:池化和生命周期

ejb生命周期无状态EJB池和生命周期的概述视图&#xff08;注释&#xff09;。 对新手有用。 。 。 。 。 EJB池&#xff1a;快速概述 EJB实例存储在称为EJB池的位置-这不过是内存中的缓存 。 无状态EJB通常按需实例化&#xff0c;即&#xff0c;当客户端调用Bean上的方法时。…

单E1光端机分类及技术指标详解

单E1光端机是一种将G.703的E1信号调制到光纤上传输的设备。采用大规模集成芯片&#xff0c;电路简单&#xff0c;功耗低&#xff0c;可靠性高&#xff0c;具有完整的告警状态指示和完善的网管功能。那么&#xff0c;单E1光端机分类及技术指标有哪些呢&#xff1f;接下来我们就跟…

将Java类作为子进程运行

我本周需要将Java类&#xff08;而不是jar&#xff09;作为子进程运行。 更准确地说&#xff0c;我想从测试内部产生一个新进程&#xff0c;而不是直接在测试内部运行&#xff08;进程内&#xff09;。 我不认为这是幻想或复杂的事情。 但是&#xff0c;这不是我以前不需要做的…

光猫的分类及应用范围有哪些?

光猫也称为单端口光端机&#xff0c;是针对特殊用户环境而设计的产品&#xff0c;它利用一对光纤进行单E1或单V.35或单10BaseT点到点式的光传输终端设备。该设备作为本地网的中继传输设备&#xff0c;适用于基站的光纤终端传输设备以及租用线路设备。而对于多口的光端机一般会直…

关于光模块用单模光纤和多模光纤小知识

通过对光纤的认知&#xff0c;我们了解到光纤是通过导光来传输信号、不导电、不怕雷击&#xff0c;所以也不需要用接地保护&#xff0c;我们按光在光纤中的传输模式分为&#xff1a;多模光纤和单模光纤。对于我们使用者来说&#xff0c;你把多模和单模名称由来记住就可以了。接…