9

hbm2ddl在基于休眠的应用程序中使用来生成数据库模式。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; 
}

然而,在执行代码时,我不断获得递增的 Id 值。例如,对于 2 个表,Id(即 Prim Key)应以 1 开头。但在 中插入记录后Table 1,序列从 的下一个值开始Table 2。它应该从表 2 的 1 重新开始。我试过GenerationType.SEQUENCE& GenerationType.AUTO。没有任何作用:-(

4

3 回答 3

9

当没有按照 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;
}
于 2011-07-31T15:12:02.787 回答
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 ...
}

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

于 2020-12-12T06:08:10.627 回答
0

休眠 5.2中,

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

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

3.2. 带注释的实体 Java 类

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

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

希望能帮助到你。

于 2016-11-25T10:41:29.923 回答