休眠类型初学者指南

基本映射概念

学习Hibernate时,许多人喜欢跳到父子关联,而无需掌握对象关系映射的基础知识。 在开始对实体关联进行建模之前,了解各个实体的基本映射规则非常重要。

休眠类型

休眠类型是SQL类型和Java原语/对象类型之间的桥梁。


这些是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” =真) 布尔值或布尔值
字节类型 天音 字节或字节
短型 SMALLINT 短或短
整数类型 整数 整型或整型
长型 比金特 长或长
浮动类型 浮动 浮动或浮动
双重类型 双倍或双倍
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));

我们可以利用EntityIdentifier Embeddable类型,因为两个表都包含entity_class和entity_id列。

@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

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

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

相关文章

fixed 语句(C# 参考)

fixed 语句禁止垃圾回收器重定位可移动的变量。fixed 语句只能出现在不安全的上下文中。Fixed 还可用于创建固定大小的缓冲区。 备注 fixed 语句设置指向托管变量的指针并在 statement 执行期间“钉住”该变量。如果没有 fixed 语句&#xff0c;则指向可移动托管变量的指针的作…

React Antd中样式的修改

如果需要对antd的样式进行修改&#xff0c; 进入你要修改的页面 注意&#xff1a;不能直接在自己的文件下面&#xff0c;加入一个css&#xff0c;修改这个class的样式&#xff0c;应该 加入global限定&#xff0c;global {} , 在{}里面写入 .classname {} 然后在设置css样式…

android /data/data/数据作用,android 清除data/data/ 下其他应用的数据

// 需在源码下编译// 实现。。。private ClearUserDataObserver mClearDataObserver;class ClearUserDataObserver extends IPackageDataObserver.Stub {public void onRemoveCompleted(final String packageName, final boolean succeeded) {/*final Message msg mHandler.ob…

使用Akka简化交易系统

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

【Python】贪心算法入门

一.引言 本文将通过两个问题和两道例题带你入门贪心算法。 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最优&#xff08;最好或最有利&#xff09;的选择&#xff0c;从而希望导致全局最优解的算法。贪心算法不保证找到全局最优…

ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录

编辑目录和新建类似&#xff0c;这里我们用MVC提供的辅助类 1.在Model 的BookShopDBDataContext分部类里添加: 2. 在CategoryController添加如下方法(注意&#xff1a;我们添加了后端验证) 3. 修改View下的EditCategory.aspx. (注意&#xff1a;我们用了MVC提供的辅助类生成Tex…

Jenkins+maven环境部署

选择使用tomcat下运行jenkins项目&#xff0c;安装步骤如下 1. 安装tomcat&#xff0c;查看想要下载的版本 https://mirrors.cnnic.cn/apache/tomcat/ wget https://mirrors.cnnic.cn/apache/tomcat/tomcat-9/v9.0.7/bin/apache-tomcat-9.0.7.tar.gz 2. 安装jdk wget --no-c…

内外边距、浮动、布局相关

关于清除元素的内外边距&#xff1a; 1、行内元素只有左右边距、没有内外边距、内边距在ie6等低版本的浏览器中也会有问题。尽量不要给元素指定行内的内外边距&#xff1b; 2、外边距的合并 使用margin定义块元素的垂直外边距时&#xff0c;可能会出现外边距的合并&#xff…

android根据mac地址连接耳机,Android获取设备IMEI和Mac地址

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;public static boolean checkPermission(Context context, String permission) {boolean result false;if (Build.VERSION.SDK_INT > 23) {try {Class> clazz Class.forName("android.content.Contex…

让vs2008支持jQuery的智能提示!

告诉大家一个非常好的消息&#xff0c;就是现在我们已可以让VS2008同时支持jQuery的智能提示功能啦可以先看看下面的效果图&#xff1a;jquery1.png (18.76 K)2008-3-30 14:37:54jquery2.png (21.18 K)2008-3-30 14:37:54怎样&#xff1f;酷吧&#xff0c;呵呵想实现以上效果只…

编写干净的测试–提防魔术

很难为干净的代码找到一个好的定义&#xff0c;因为我们每个人都有自己的单词clean的定义。 但是&#xff0c;有一个似乎是通用的定义&#xff1a; 干净的代码易于阅读。 这可能会让您感到有些惊讶&#xff0c;但是我认为该定义也适用于测试代码。 使测试尽可能具有可读性是我…

Eclipse创建Java Web项目及基本配置

https://www.cnblogs.com/zzlback/p/8552622.html转载于:https://www.cnblogs.com/aiyowei/p/10428638.html

为什么要使用Vuex?

为什么要使用Vuex? 1. 假如不使用 1.1 父子组件依赖同一个state 1.2 兄弟组件依赖同一个state 2. 用了Vuex之后 3. 方便记忆和理解 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

十个习惯让你精通新的开发技术

Ben Watson&#xff0c;知名开发者。任职于GeoEye&#xff0c;是其所属开发团队的领导者。本文发表于他自己的博客&#xff0c;阐述了十种学习新技术的方法。 1、要看书 在成千上万的编程图书中&#xff0c;可能很大一部分根本毫无用处。但是仍然有很多图书对你的(编程)能力有很…

基于android平台的24点游戏设计与实现需求分析,基于Android平台的24点游戏设计与实现需求分析_毕业设计论文.doc...

基于Android平台的24点游戏设计与实现摘要随着移动设备的普及以及移动设备的硬件的提升&#xff0c;移动设备的功能越来越完善&#xff0c;移动设备的系统平台也日渐火热起来。目前国内最常见的移动开发平台有Symbian&#xff0c;iPhone&#xff0c;Windows Phone以及当下正在逐…

序列化代理模式示例

有些书可以极大地改变您的生活。 其中一本是Joshua Bloch撰写的“ Effective Java” 。 在下面您可能会发现一些小的实验&#xff0c;该实验的灵感来自于本书的第11章“串行化”。 假设我们有一个为继承而设计的类&#xff0c;它本身不是可序列化的 &#xff0c;并且没有无参数…

fit_transform和transform的区别

部分转载 https://blog.csdn.net/weixin_38278334/article/details/82971752 https://www.cnblogs.com/summer-nude/p/7380694.html 写在前面fit和transform没有任何关系&#xff0c;仅仅是数据处理的两个不同环节&#xff0c;之所以出来fit_transform这个函数名&#xff0c;仅…

使用注解配置Spring

使用注解配置Spring 1.为主配置文件引入新的命名空间(约束) 2.开启使用注解代理配置文件 3.在类中使用注解完成配置 将对象注册到容器 修改对象的作用范围 值类型注入 引用类型注入 注意: 初始化|销毁方法 转载于:https://www.cnblogs.com/HiJackykun/p/10428728.html

android监控指纹信息变化,android监听指纹变化(解决反射思路在android10不生效的问题)...

前天偶尔运行代码&#xff0c;一个段异常映入眼帘&#xff0c;我擦android10上反射机制监听不到指纹id等数据了&#xff0c;原因是android10彻底抛弃了之前指纹的api。所以反射不到了。怎么解决这个问题&#xff1f;我们换个思路当然反射依然可以&#xff0c;不过你需要在andro…

[转载]数据结构笔试题基础

第一章 数据结构与算法 一.算法的基本概念计算机解题的过程实际上是在实施某种算法&#xff0c;这种算法称为计算机算法。 1.算法的基本特征&#xff1a;可行性&#xff0c;确定性&#xff0c;有穷性&#xff0c;拥有足够的情报。 2.算法的基本要素&#xff1a;算法中对数据的运…