hibernate 标识符

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或默认为序列生成策略。

仅在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规范, 我们的主键类必须为:

  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

hibernate 标识符

hibernate 标识符_Hibernate中的标识符相关推荐

  1. 在C语言中 下面标识符非法的是,下面哪一项在Java中是非法的标识符? 答案:Youme...

    相关问题 下列选项中,符合Python命名规范的标识符是( ): 选项 中 Python 标识符 name 指针,描述,变量,变量,变量,地址,值,类型,变量,类型,命名,规则,标识符,指针,时,号, ...

  2. Hibernate提供的内置标识符生成器

    Hibernate提供的内置标识符生成器 Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键来识别或区分同一个表的不同记录.Hibernate使用OID(对象标识符)来统一两者之 ...

  3. Python中的标识符有哪些基础原则?

    很多同学学习Python技术的过程中,会接触一些标识符的知识,这部分也是Python的基础知识,那么Python中的标识符有哪些基础原则?接下来我们一起来看看详细的内容介绍吧,希望对你们有Python ...

  4. java中的标识符和关键字_浅谈java中的标识符、修饰符和关键字

    合法标识符 Java语言中,对于变量,常量,函数,语句块均有名字,我们统统称之为Java标识符.标识符是用来给类.对象.方法.变量.接口和自定义数据类型命名的. 组成:Java标识符由数字,字母和下划 ...

  5. python中不区分大小写语句怎么写_Python中的标识符不区分大小写。( )_学小易找答案...

    [单选题]在循环体中使用( )语句可以跳出循环体. [单选题]下列关于Python中的复数,说法错误的是( ). [其它]请各位同学按照题目自行练习. 全国计算机等级考试<数据结构>典型试 ...

  6. C语言中的标识符作用域

    2018-01-15 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com 一.定义 程序中该标识符可以使用的区域. 例如:函数内的局部变量的作用域仅限于函数体本身. 说明了两点: ...

  7. python中的标识符能不能使用关键字_Python中的标识符不能使用关键字

    Python中的标识符不能使用关键字 答:√ 智慧职教: 检查客室座椅外观良好,确认?无破损 答:坐垫 靠背 关于投标报价时综合单价的确定,下列做法中正确的是() 答:以项目特征描述为依据确定综合单价 ...

  8. C语言中的标识符以字母或下划线开头,牛逼大神整理的C语言基础知识,你确定你不码下来?...

    [[怪兽爱C语言]牛逼大神整理的C语言基础知识,你确定你不码下来?]https://toutiao.com/group/6577344220355363341/?iid=15906422033& ...

  9. html类名定义规则_好程序员分享Java语言中的标识符规则

    好程序员分享Java语言中的标识符规则,在编程过程中,经常需要在程序中定义一些符号来标记一些名称,如包名.类名.方法名.参数名.变量名等,这些符号被称为标识符.标识符可以由任意顺序的大小写字母.数字. ...

最新文章

  1. 博世投资张翠波:自动驾驶需要突破芯片、传感器、深度学习算法等关键技术
  2. DataGrid中选择列文本根据绑定数据不同显示为不同颜色的处理办法
  3. word公式插件_添加office小插件,让办公更高效
  4. Spring MVC 参数自动绑定List的解决方案
  5. 虚拟机ping不通主机与外网的解决方法
  6. 【数学分析新讲 笔记】第一章 实数
  7. FlexSim仿真软件入门笔记:基本操作、快捷键
  8. easydarwin 安装_EasyDarwin流媒体服务器
  9. python学习笔记30(利用turtle绘制最基本的几何图形)
  10. 误差柱状图的三种实现方法
  11. 剑指offer_3 -- 构建乘积数组
  12. 请谨慎使用预训练的深度学习模型
  13. 2022基金从业考试如何备考
  14. 运筹说 第66期|贝尔曼也有“演讲恐惧症”?
  15. 数据库课程设计-员工信息管理系统(基于python和MySQL实现)
  16. iOS小技能:iOS15崩溃排查技巧(symbolicatecrash符号化分析问题、导出和隐藏符号)
  17. 挺住! “6·18” | 万亿消费狂欢背后的IT构建
  18. NOIP提高组完善程序题目分析
  19. python一维数组和二维数组,Python numpy实现二维数组和一维数组拼接的方法
  20. 印象笔记文章转到kindle上文字显示小的解决办法

热门文章

  1. P3834 【模板】可持久化线段树 2(整体二分做法)
  2. CF1043E Train Hard, Win Easy
  3. POJ3177 Redundant Paths
  4. 【学习笔记】WQS二分详解及常见理解误区解释
  5. P1613-跑路【Floyd,倍增】
  6. 【线段树】Traffic Jams in the Land(CF498D)
  7. 【图论】【模板】静态仙人掌(luogu 5236)
  8. 【01背包】最大约数和(jzoj 2126)
  9. Full_of_Boys训练1总结
  10. Java web文件下载断点续传