首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写序列生成的id

重写序列生成的id
EN

Stack Overflow用户
提问于 2021-12-13 12:26:25
回答 1查看 298关注 0票数 0

我使用SequenceGenerator为我的实体生成主密钥。现在有一个用例,其中我需要使用给定的id,而不是序列生成的id。

我尝试根据给定的值设置id字段并保存它,但是自定义id已被序列覆盖。那么,如果指定的id不是null,是否可以告诉hibernate使用给定的id,或者如果id没有显式设置,则使用序列生成一个新的id?

我现在的身份证发生器

代码语言:javascript
复制
    @Id
    @SequenceGenerator(name = "userSeqGen", sequenceName = "userSeq", initialValue = 100, allocationSize = 50)
    @GeneratedValue(generator = "userSeqGen")
    private Integer id;
EN

回答 1

Stack Overflow用户

发布于 2021-12-13 15:24:07

如果实体的@Id字段没有@GeneratedValue,则允许手动为该实体分配ID。

这意味着您可以为需要手动配置ID的用例创建映射到同一个表的另一个实体,并将该实体与@GeneratedValue一起用于普通用例。

通过使用某些继承设计,您可能拥有如下内容:

代码语言:javascript
复制
@MappedSuperclass
public class Employee  {

    @Column
    private String email;

    @Column
    private String title;
    
    ......
}
代码语言:javascript
复制
@Entity
@Table(name="employee")
public class DefaultEmployee extends Employee {

    @Id
    @SequenceGenerator(name = "userSeqGen", sequenceName = "userSeq", initialValue = 100, allocationSize = 50)
    @GeneratedValue(generator = "userSeqGen")
    private Integer id;
}
代码语言:javascript
复制
@Entity
@Table(name="employee")
public class ManuallyAssignedIdEmployee extends Employee {

    @Id
    private Integer id;

    public ManuallyAssignedIdEmployee(Integer id){
       this.id = id;
    }


}

如果需要使用手动分配的id创建员工,请创建ManuallyAssignedIdEmployee实例。否则,创建DefaultEmployee实例。

请注意,由于在某些情况下您是手动分配ID,因此您有责任确保手动分配的ID不会与从DB序列自动生成的ID混淆。(例如,手动分配的Id已经自动生成并由其他记录使用,或者将来无法使用自动生成的ID,因为您已经将其手动分配给过去的一些记录,等等)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70334654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档