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

时间:2011-07-29 19:30:54

标签: hibernate hibernate-annotations hbm2ddl

我在基于hibernate的应用程序中使用hbm2ddl来生成数据库模式。 hibernate.hbm2ddl.auto属性的值为create-drop

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

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

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

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

3 个答案:

答案 0 :(得分:6)

当没有提供JPA规范指定的生成器时,您正在使用hibernate默认提供的全局序列生成器。要拥有私有生成器,您应声明带有注释@SequenceGenerator的私有生成器,并设置generator注释的@GeneratedValue属性

从javadoc中提取

  

@GeneratedValue
  (可选)要指定使用的主键生成器的名称   在SequenceGenerator或TableGenerator注释中。

     

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

     

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

     

示例:

     

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

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

Section 1.3. Properties
2.2.3. Mapping identifier properties

完整示例

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

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PRIVATE_SEQ")
    Long id;
}

答案 1 :(得分:1)

 @Entity
    public class MyEntity2 {
        
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="myentity2_seq")
        @SequenceGenerator(name = "myentity2_seq",sequenceName = "myentity2_seq_table")
        private int id;

    @Column(length = 100)
    private String name;
//setters & getters ...
}

在数据库中,它将创建用于维护ID的 myentity2_seq_table 表。我们可以使用SequenceGenerator中的initialValue = 100,allocationSize = 10来自定义表创建。

答案 2 :(得分:0)

Hibernate 5.2 中,

我曾尝试过Joel Hudon的回答,但不知道为什么它不起作用。

我找到了一些较短的代码来解决它。

mainEntity

@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
public int id;

它可以给出唯一的序列号。

希望它有所帮助。