我在基于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
。什么都行不通: - (
答案 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的回答,但不知道为什么它不起作用。
我找到了一些较短的代码来解决它。
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
public int id;
它可以给出唯一的序列号。
希望它有所帮助。