在使用hbm2ddl生成模式时,为什么两个实体共享相同序列的顺序问题?

Ash*_*wal 3 hibernate hbm2ddl hibernate-annotations

hbm2ddl在基于hibernate的应用程序中使用生成数据库模式.hibernate.hbm2ddl.auto财产的价值是create-drop.

我正在@Entity为我的POJO课程使用注释.

@Entity 
public class testTable1 {
     @Id     
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     Long id; 
}

@Entity 
public class testTable2 {
     @Id     
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     Long id; 
}
Run Code Online (Sandbox Code Playgroud)

但是在执行代码时,我不断获得增量Id值.例如,对于2个表,Id(即Prim Key)应该以1开始.但是在插入记录之后Table 1,序列从下一个值开始Table 2.它应该从表2的1开始.我试过GenerationType.SEQUENCE&GenerationType.AUTO.什么都行不通:-(

Joe*_*don 6

当没有提供JPA规范指定的生成器时,您正在使用hibernate默认提供的全局序列生成器.为了有一个私人发电机应声明与注释的私人发电机@SequenceGenerator,并设置generator该属性@GeneratedValue注释

从javadoc中提取

@GeneratedValue
(可选)要在SequenceGenerator或TableGenerator批注中指定的主键生成器的名称.

默认为持久性提供程序提供的id生成器.

SequenceGenerator
此批注定义了一个主键生成器,当为GeneratedValue批注指定了生成器元素时,该生成器可以通过名称引用.可以在实体类或主键字段或属性上指定序列生成器.生成器名称的范围对于持久性单元是全局的(跨所有生成器类型).

例:

@SequenceGenerator(name="EMP_SEQ", sequenceName="private_sequence")

Hibernate建议新项目使用hibernate.id.new_generator_mappings = true,因为新生成器更高效,更接近JPA 2规范语义

第1.3节.属性
2.2.3.映射标识符属性

完整的例子

@Entity
@SequenceGenerator(name="PRIVATE_SEQ", sequenceName="private_sequence")
public class test {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PRIVATE_SEQ")
    Long id;
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我想补充一点,如果你想设置初始值和分配大小,你需要包括hibernate.id.new_generator_mappings = true.然后你只需要像这样使用@SequenceGenerator:@SequenceGenerator(initialValue = 1,allocationSize = 1,name ="PRIVATE_SEQ",sequenceName ="private_sequence")或你需要提供的任何值. (2认同)