hibernate 标识符_Hibernate中的标识符
hibernate 标识符
Hibernate中的标识符为实体的主键属性建模。 它有助于我们唯一地标识JPA实体。 每个实体都必须定义一个标识符。 同样,它可以是简单的也可以是复合的。
我们可以通过几种方式定义一个Hibernate标识符。 在本教程中,我们将学习如何做。
简单(单值)标识符:
如果我们有一个可以唯一标识我们实体的属性,则可以使用@Id注释对该属性进行简单注释:
Java
@Entity
public class Employee {@Idprivate Integer empId;...
}
请记住,用@Id注释的属性应为以下类型之一:
- 任何Java基本类型或任何原始包装器类型
- 串
- 任何Java 日期类型,或者
- BigDecimal或BigInteger
简单生成的标识符:
如果我们希望自动生成ID值怎么办? 为此,我们可以更进一步,在标识符字段上使用@GeneratedValue批注:
Java
@Entity
public class Employee {@Id@GeneratedValuepublic Integer empId;...
}
当使用@GeneratedValue时 ,Hibernate在保留实体的同时会为我们的id列生成值。 对我们而言,重要的是要记住, 我们只能自动生成整数类型( int,short或long )或UUID 。
此外,我们提供了四种不同的密钥生成策略,可自动生成标识符的值:
Hibernate使用AUTO密钥生成策略作为默认策略。 从一个JPA持久性提供者到另一个JPA持久性提供者, AUTO策略的行为略有不同。 对于 Hibernate,如果 identifier属性的类型为UUID,则它使用UUIDGenerator或默认为序列生成策略。
仅在Hibernate 5和更高版本中支持UUID生成,并且长度为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规范, 我们的主键类必须为:
- 用@EmbeddedId或@IdClass注释进行注释
- 公开并有一个公开的无参数构造函数
- 可序列化
- 实现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实体具有一个由empId和productId组成的复合键。
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
hibernate 标识符
hibernate 标识符_Hibernate中的标识符相关推荐
- 在C语言中 下面标识符非法的是,下面哪一项在Java中是非法的标识符? 答案:Youme...
相关问题 下列选项中,符合Python命名规范的标识符是( ): 选项 中 Python 标识符 name 指针,描述,变量,变量,变量,地址,值,类型,变量,类型,命名,规则,标识符,指针,时,号, ...
- Hibernate提供的内置标识符生成器
Hibernate提供的内置标识符生成器 Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键来识别或区分同一个表的不同记录.Hibernate使用OID(对象标识符)来统一两者之 ...
- Python中的标识符有哪些基础原则?
很多同学学习Python技术的过程中,会接触一些标识符的知识,这部分也是Python的基础知识,那么Python中的标识符有哪些基础原则?接下来我们一起来看看详细的内容介绍吧,希望对你们有Python ...
- java中的标识符和关键字_浅谈java中的标识符、修饰符和关键字
合法标识符 Java语言中,对于变量,常量,函数,语句块均有名字,我们统统称之为Java标识符.标识符是用来给类.对象.方法.变量.接口和自定义数据类型命名的. 组成:Java标识符由数字,字母和下划 ...
- python中不区分大小写语句怎么写_Python中的标识符不区分大小写。( )_学小易找答案...
[单选题]在循环体中使用( )语句可以跳出循环体. [单选题]下列关于Python中的复数,说法错误的是( ). [其它]请各位同学按照题目自行练习. 全国计算机等级考试<数据结构>典型试 ...
- C语言中的标识符作用域
2018-01-15 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com 一.定义 程序中该标识符可以使用的区域. 例如:函数内的局部变量的作用域仅限于函数体本身. 说明了两点: ...
- python中的标识符能不能使用关键字_Python中的标识符不能使用关键字
Python中的标识符不能使用关键字 答:√ 智慧职教: 检查客室座椅外观良好,确认?无破损 答:坐垫 靠背 关于投标报价时综合单价的确定,下列做法中正确的是() 答:以项目特征描述为依据确定综合单价 ...
- C语言中的标识符以字母或下划线开头,牛逼大神整理的C语言基础知识,你确定你不码下来?...
[[怪兽爱C语言]牛逼大神整理的C语言基础知识,你确定你不码下来?]https://toutiao.com/group/6577344220355363341/?iid=15906422033& ...
- html类名定义规则_好程序员分享Java语言中的标识符规则
好程序员分享Java语言中的标识符规则,在编程过程中,经常需要在程序中定义一些符号来标记一些名称,如包名.类名.方法名.参数名.变量名等,这些符号被称为标识符.标识符可以由任意顺序的大小写字母.数字. ...
最新文章
- 博世投资张翠波:自动驾驶需要突破芯片、传感器、深度学习算法等关键技术
- DataGrid中选择列文本根据绑定数据不同显示为不同颜色的处理办法
- word公式插件_添加office小插件,让办公更高效
- Spring MVC 参数自动绑定List的解决方案
- 虚拟机ping不通主机与外网的解决方法
- 【数学分析新讲 笔记】第一章 实数
- FlexSim仿真软件入门笔记:基本操作、快捷键
- easydarwin 安装_EasyDarwin流媒体服务器
- python学习笔记30(利用turtle绘制最基本的几何图形)
- 误差柱状图的三种实现方法
- 剑指offer_3 -- 构建乘积数组
- 请谨慎使用预训练的深度学习模型
- 2022基金从业考试如何备考
- 运筹说 第66期|贝尔曼也有“演讲恐惧症”?
- 数据库课程设计-员工信息管理系统(基于python和MySQL实现)
- iOS小技能:iOS15崩溃排查技巧(symbolicatecrash符号化分析问题、导出和隐藏符号)
- 挺住! “6·18” | 万亿消费狂欢背后的IT构建
- NOIP提高组完善程序题目分析
- python一维数组和二维数组,Python numpy实现二维数组和一维数组拼接的方法
- 印象笔记文章转到kindle上文字显示小的解决办法