休眠中的标识符

Hibernate中的标识符为实体的主键属性建模。 它有助于我们唯一地标识JPA实体。 每个实体都必须定义一个标识符。 同样,它可以是简单的也可以是复合的。

我们可以通过几种方式定义一个Hibernate标识符。 在本教程中,我们将学习如何做。

简单(单值)标识符:

如果我们有一个可以唯一标识我们实体的属性,则可以使用@Id注释对该属性进行简单注释:

Java

@Entity
public class Employee {@Idprivate Integer empId;...
}

请记住,用@Id注释的属性应为以下类型之一:

  • 任何Java基本类型或任何原始包装器类型
  • 任何Java 日期类型,或者
  • BigDecimalBigInteger

简单生成的标识符:

如果我们希望自动生成id值怎么办? 为此,我们可以更进一步,在标识符字段上使用@GeneratedValue批注:

Java

@Entity
public class Employee {@Id@GeneratedValuepublic Integer empId;...
}

当使用@GeneratedValue时 ,Hibernate在保留实体的同时会为我们的id列生成值。 对我们而言,重要的是要记住, 我们只能自动生成整数类型( int,shortlong )或UUID

另外,我们有四种不同的密钥生成策略可用于自动生成标识符的值:

Hibernate使用AUTO密钥生成策略作为默认策略。 从一个JPA持久性提供者到另一个JPA持久性提供者, AUTO策略的行为略有不同。 对于 Hibernate,如果 identifier属性的类型为UUID,则它使用UUIDGenerator ,否则默认为序列生成策略。

UUID生成仅在Hibernate 5和更高版本中受支持,并且长度为36个字符:

Java

@Entity
public class Employee {@Id@GeneratedValueprivate UUID empId;...
}

生成的UUID的格式为“ 4ee5a777-7981-4e01-06ab-19aabb2eaa122”。

对于IDENTITY生成策略,Hibernate使用IdentityGenerator生成标识符值 这些值是由数据库的标识列生成的,并且会自动递增:

Java

@Entity
public class Employee {@Id@GeneratedValue (strategy = GenerationType.IDENTITY)private Integer empId;...
}

使用此策略的主要缺点是它不支持批处理JDBC插入。

在这里,顾名思义,数据库序列用于生成我们的标识符的值。 Hibernate在内部使用SequenceStyleGenerator类来实现它。 如果我们的数据库不支持序列,它将自动切换到TABLE密钥生成策略。

SEQUENCE生成器为每个序列生成唯一的值。 我们可以指定我们希望使用的数据库顺序:

Java

@Entity
public class Employee {@Id@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "emp_generator")@SequenceGenerator(name = "emp_generator",sequenceName = "emp_seq", allocationSize = 100)public Integer empId;...
}

否则,Hibernate将使用隐式命名的序列hibernate_sequence

Java

@Entity
public class Employee {@Id@GeneratedValue(strategy = GenerationType.SEQUENCE)public Integer empId;...
}

为我们的标识符字段生成值。

Hibernate TableGenerator使用一个表,该表能够保存标识符生成值的多个段。 除非指定,否则Hibernate默认使用hibernate_sequences表:

Java

@Entity
public class Employee {@Id@GeneratedValue(strategy = GenerationType.TABLE)public Integer empId;...
}

我们可以使用@TableGenerator来指定用于生成值的数据库表:

Java

@Entitypublic class Employee {@Id@GeneratedValue(strategy = GenerationType.TABLE, generator = "emp_generator") @TableGenerator(name = "emp_generator",table = "emp_generator_tbl",schema = "employees")public Integer empId;...}

TABLE策略的伸缩性不是很好,并且性能很差,因此在实际的实现中很少使用。 对于所有支持序列的数据库,我们总是应该优先使用SEQUENCE生成策略,而大多数现代数据库通常都会这样做。

复合标识符:

Hibernate还允许我们定义一个复合标识符。 要定义组合标识符,我们创建一个主键类,其中包含构成组合键的持久属性。 根据JPA规范, 我们的主键类必须为:

  1. @EmbeddedId@IdClass注释进行注释
  2. 公开并有一个公开的无参数构造函数
  3. 可序列化
  4. 实现equals()hashCode()方法

组成合成的属性可以是basic,composite或ManyToOne。 但是,集合和OneToOne属性被认为不合适。

1.使用

定义和使用复合键的一种方法是使用@EmbeddedId批注

因此,让我们开始定义主键类并使用@Embeddable对其进行注释

Java

@Embeddable
public class EmployeePurchasesPK implements Serializable {private long empId;private long productId;//equals() and hashCode() methods...
}

现在,我们可以使用@EmbeddedId批注轻松地从我们的实体中引用此类:

Java

@Entity
public class EmployeePurchases {@EmbeddedIdprivate EmployeePurchasesPK primaryAttributes;...
}

要使用我们的实体类设置或检索主键属性,我们将具有以下内容:

Java

EmployeePurchasesPK primaryAttributes = new EmployeePurchasesPK();
primaryAttributes.setEmpId(1001);
primaryAttributes.setProductId(7822);EmployeePurchases empPurchases = new EmployeePurchases();
empPurchases.setPrimaryAttributes(primaryAttributes);
...

显然,我们的EmployeePurchases实体具有一个由empIdproductId组成的复合键。

2.使用

使用@IdClass创建复合键时我们可以使用@Id批注在主类中定义所有合成属性。 我们的主键类中的代码保持原样,但仅充当“影子”

Java

@Entity
@IdClass(EmployeePurchasesPK.class)
public class EmployeePurchases {@Idprivate long empId;@Idprivate long productId;...}

通过这种方法,我们可以使用主要实体类的getter / setter方法直接设置键值:

Java

EmployeePurchases empPurchases = new EmployeePurchases(); 
empPurchases.setEmpId(1011);
empPurchases.setProductId(9331);
...

但是,此方法无法为我们提供标识符和实体对象之间的清晰区分。

派生标识符:

在Hibernate中,我们可以选择使用@MapsId注释从其关联之一复制实体的标识符值

Java

public class EmployeeHistory {@Idprivate long id;@OneToOne@MapsIdprivate Employee employee;...}

在这里,我们的EmployeeHistory实例将具有与相应Employee实例完全相同的ID

结论:

在本教程中,我们研究了在Hibernate中定义标识符的多种方法。 我们还介绍了不同的关键自动生成策略。

成为第一个发表评论的人。

翻译自: https://www.javacodegeeks.com/2019/04/identifiers-hibernate.html

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

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

相关文章

21秋期末考试建筑力学与结构10126k2

1、受压可能有三种破坏形态, ( ) 表现出明显的脆性,工程设计中必须避免发生。(2 分) A.劈裂破坏–一裂就坏 B.竖向裂缝发展导致的破坏–先裂后坏 C.B和C D.局…

LoRa与NB-IoT物联网应用对比方案

一、LoRa技术 LoRa是由美国Semtech公司推出的一种基于扩频技术的超远距离无线传输方案,属于低功耗广域网(LoRaWAN),是一种低带宽、远距离、低功耗、连接量多的物联网通信技术。NB-IOT是由3GPP标准化组织定义的物联网窄带射频技术,是一种低功…

21秋期末考试财务会计(一)10166k2

1、在确定借款费用资本化金额时,与专门借款有关的利息收入应( )。 (2 分) A.计入营业外收入 B.冲减借款费用资本化的金额 C.冲减所购建的固定资产成本 D.计入当期财务费用…

485光隔离中继器产品特点及应用领域介绍

光电隔离RS485/RS422中继器,可作为485信号中继放大或485信号转422信号使用,一款专为解决RS-485/422信号长距离传输时,信号弱、信号易干扰问题的产品。那么,485光隔离中继器产品有哪些特点,485中继器主要应用在哪些领域…

SX1280抗WIFI强干扰电磁环境能力解析

SX1280的LORA模式在关于WIFI干扰的情况下相交于传统调制方式具有极大的优势。 与用于共存的传统调制技术相比,LoRa物理层的使用为我们提供了一些潜在的额外性能好处,并对带内和通道内干扰提供了额外的抗干扰能力。具体优势如下: 1、扩频 LoR…

[渝粤教育] 广东-国家-开放大学 21秋期末考试管理会计10171k2 (2)

单项选择题 1、企业某产品本月单位变动生产成本为200元,单位变动非生产成本10元,固定生产成本400000元,固定非生产成本100000元。该产品期初存货为零,本月产量10000件,销量8000件,销售单价300元。按变动成本…

TTL电平、CMOS电平、RS232通信电平的概念及区别

电平的概念: 什么是电压、电流、电功率?无线电爱好者都十分清楚。而谈及“电平”能说清楚的人却不多。尽管人们经常遇到,书刊中亦多次谈起电路中的高电平、低电平、电平增益、电平衰减,就连电工必备的万用表上都有专测电平的方法…

[渝粤教育] 广东-国家-开放大学 大学英语2

1、He has_______since three days ago.(2 分) A.gone away B.gone C.left D.been away 2、What an interesting book! I don’t want to .(2 分) A.give to it B&#x…

485通讯转换器产品功能特点介绍

485转换器主要的作用是将单端的RS-232信号转换为平衡差分的RS-485或RS-422信号。RS-485、RS-422自动识别功能,使用更加简单。那么,485转换器产品有哪些特点呢?接下来我们就跟随飞畅科技的小编一起来看看吧! 485转换器产品特点 支…

基于无线通信技术的智能公交系统设计

公共交通具有个体交通无法比拟的强大优势,优先发展城市公共交通系统是解决大、中城市交通问题的最佳途径。近年来,城市公交系统的智能化已成为公共交通研究领域的主要方向。国内现有试运行的智能公交系统大部分都采用GPS全球定位系统进行定位&#xff0c…

java陷阱常见面试题_Java常见陷阱

java陷阱常见面试题总览 Java是一种极简主义的语言,具有比其他语言故意更少的功能,尽管如此,Java仍然具有产生奇怪效果的边缘情况,甚至具有令人惊讶的效果的一些常见情况也会使您轻而易举。 如果您习惯于阅读另一种语言&#xff0…

【渝粤教育】 广东开放大学21秋期末考试法律职业伦理10214k2

1、指导法律职业人员的最高原则是()。(2 分) A.清正廉洁,奉公守法 B.严明纪律,保守秘密 C.以事实为根据,以法律为准绳 D.互相尊重,互相…

LoRaWAN网络协议与LoRa私有协议相比有哪些优势

物联网很多应用现在都普遍用了LoRa技术的芯片,然而没有使用LoRaWan网络协议。经过调查发现,没有使用LoRaWAN网络协议的原因有:应用点数少、规模小,有的是因为LoRaWAN成本高,技术要求高,短时间内无法掌握&am…

【渝粤教育】国家开放大学2018年春季 0471-21T畜牧学 参考试题

科目编号:[0471] 座位号 2017-2018学年度第二学期期末考试 畜牧学 试题 2017年 12 月 一、名词解释(本大题共5小题,每小题3分,共计15分) 1.限制性氨基酸 2.短期优饲 3.顶体反应 4&#xff0…

如何选择LoRa产品

LoRa以其“长距离,低功耗”的优势,成为物联网通信技术的后起之秀。LoRaWAN以其明显的优势:大容量、全球统一的标准、免费频段、低成本与灵活性,和WiFi一样,成为“私有物联网”的首要选择(NB-IoT&#xff0c…

485转换器产品类型介绍

485转换器从性能上可以分为如下几种:无源型485转换器,有源型485转换器,防雷型485转换器,光隔离型485转换器,防雷光隔离型485转换器。接下来我们就跟随飞畅科技的小编一起来详细了解下吧! 1、无源型485转换…

Java队列接口

介绍: 队列是FIFO(先进先出)抽象数据类型(ADT)。 换句话说,按插入顺序将元素删除。 java.util.Queue是Java 中的接口,并且从java.util.Collection扩展。 一些常用的Queue实现类包括LinkedList&…

CC1310在868MHz的电路设计

一、CC1310的简单介绍 特点 CC1310器件是一款高度集成、真正的单片解决方案,其整合了一套完整的RF系统及一个片上DC-DC转换器。该器件具有出色的灵敏度和稳定性(可选择性和阻断)性能,不会以牺牲RF性能为代价来实现低功耗。极低的…

Memobus总线光端机产品功能介绍

Memobus现场总线光纤转换器,提供RS-485串口,符合基于Memobus的串行通信,通信速率4Mbps,单/双光口链网支持。产品支持一路光纤接口,一路总线数据接口,支持两路可级联上下行光纤接口,一路总线数据…

SX1301吞吐量是SX1276/8的多少倍?

1.吞吐量,LoRa网关的重要性能 从广义上讲,网关是连接2个不同网络的设备。如果一个设备,它能将LoRa无线网络和Internet连接起来,它就是一个LoRa网关。 目前,大部分的LoRa网关采用SX1301基带芯片,也有部分使…