目录
- 1. 说明
- 2. 主键生成策略
- 3. hibernate_sequence表的创建
- 4. 如何避免自动创建hibernate_sequence表
1. 说明
- 1.JPA(Java Persistence API)在默认情况下,如果使用Hibernate作为持久化框架,并且没有显式指定主键生成策略,它可能会自动创建一个名为hibernate_sequence的序列表。
- 2.这个序列表用于生成唯一的主键值,特别是当使用@GeneratedValue注解且没有指定strategy属性时。
- 3.JPA规范支持多种主键生成策略,包括AUTO、IDENTITY、SEQUENCE和TABLE。这些策略决定了如何生成主键值。
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
2. 主键生成策略
- 1.AUTO:允许持久化提供者选择生成策略。如果使用Hibernate,它通常会基于数据库特定的Dialect选择生成策略。对于大多数流行的关系数据库,如MySQL,Hibernate会选择SEQUENCE生成策略(如果数据库支持序列),或者在某些情况下选择TABLE或IDENTITY策略。
- 2.IDENTITY:使用数据库的身份列(通常是自增列)来生成主键值。这是MySQL等数据库常用的策略。
- 3.SEQUENCE:使用数据库序列来生成唯一值。这通常用于支持序列的数据库,如Oracle。
- 4.TABLE:使用一个单独的数据库表来生成主键值。这个表通常包含两个列:一个用于存储当前的最大主键值,另一个用于存储生成主键值的增量。
3. hibernate_sequence表的创建
- 1.当JPA实体使用@GeneratedValue注解且没有指定strategy属性,并且Hibernate选择SEQUENCE作为生成策略时(这取决于数据库Dialect和配置),Hibernate会自动创建一个名为hibernate_sequence的序列表。
- 2.这个表只有一列(通常是next_val),用于存储下一个主键值。
- 3.每次需要生成新主键时,Hibernate会向这个序列表中插入一行(或更新现有行),以获取下一个主键值。
- 4.这个过程是自动的,通常不需要开发者干预。
4. 如何避免自动创建hibernate_sequence表
- 1.显式指定主键生成策略:在@GeneratedValue注解中明确指定strategy属性为IDENTITY,这样Hibernate就会使用数据库的身份列来生成主键值,而不会创建序列表。
- 2.使用自定义序列:如果你确实需要使用序列来生成主键值(例如,在Oracle数据库中),你可以使用@SequenceGenerator注解来定义一个自定义的序列,并在@GeneratedValue注解中引用它。Hibernate就会使用你定义的序列而不是默认的hibernate_sequence。
- 3.配置Hibernate属性:在某些情况下,你可以通过配置Hibernate的属性来禁用序列表的自动创建。这通常不是推荐的做法,它可能依赖于特定的Hibernate版本和数据库Dialect。