实体映射与标识符生成策略详解
1. 实体标识符映射基础
在没有候选键的常见情况下,使用专门的主键列是合适的。实际上,数据库模式中的每个表都应该有一个专门用于此目的的代理主键列。生成代理键值有多种知名方法,可通过 @GeneratedValue
注解进行配置。
@Id
注解用于标记实体类的标识符属性。若没有 @GeneratedValue
注解,JPA 提供程序会认为你将在保存实例之前自行创建并分配标识符值,这称为应用程序分配标识符。在处理遗留数据库和/或自然主键时,手动分配实体标识符是必要的。
若希望系统在保存实体实例时生成主键值,可在 @Id
旁边添加 @GeneratedValue
注解。JPA 通过 javax.persistence.GenerationType
枚举标准化了几种值生成策略,可通过 @GeneratedValue(strategy = ...)
进行选择:
- GenerationType.AUTO
:Hibernate 会根据配置的数据库 SQL 方言选择合适的策略,等同于 @GeneratedValue()
无任何设置。
- GenerationType.SEQUENCE
:Hibernate 期望(若使用工具会创建)数据库中有一个名为 HIBERNATE_SEQUENCE
的序列,每次 INS