在定义Entity的ID字段时,我们可以使用@GeneratedValue注解指定以何种方式生成数据库的主键ID的值。有几种策略:
1. 默认情况下,是自动生成策略。
比如下边两种方式效果是一样的。如果使用的是Springboot JPA Data, 那hibernate会自动帮我们创建一个Sequence,然后通过该Sequence,为所有生成策略是Auto的表使用该Sequence,也就是多个表共享一个Sequence。
@Entity
public class Student {
@Id
@GeneratedValue
private long studentId;
// ...
}
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long studentId;
// ...
}
2. IDENTITY生成策略。
就是ORM框架不负责生成ID,而是由数据库创建表时,将主键列,制定成自增(auto increment)。应用程序向数据库插入数据时,无需指定该列的值。
@Entity
public class Student {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private long studentId;
// ...
}
3. 我们自定义的数据库的Sequence方式。
这也是Hibernate官方推荐的方式,为每一个表创建一个Sequence。Hibernate在生成@ID标注的字段的值时,先访问数据库,查询下一个Sequence的值,再封装完整的insert语句插入数据。
@Entity
public class User {
@Id
@GeneratedValue(generator = "sequence-generator")
@GenericGenerator(
name = "sequence-generator",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "user_sequence"),
@Parameter(name = "initial_value", value = "4"),
@Parameter(name = "increment_size", value = "1")
}
)
private long userId;
// ...
}
另外,还有表的方式生成ID主键值,不推荐,这里不详细说了。
参考文档:
https://www.baeldung.com/hibernate-identifiers