【问题标题】:Overriding id generated by sequence覆盖序列生成的 id
【发布时间】:2022-01-16 22:12:23
【问题描述】:

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

我尝试通过给定值设置 id 字段并保存它,但自定义 id 已被序列覆盖。那么有没有什么方法可以告诉休眠使用给定的id,如果它不为null,或者如果id没有明确设置,则使用序列生成一个新的id?

我当前的 id 生成器

    @Id
    @SequenceGenerator(name = "userSeqGen", sequenceName = "userSeq", initialValue = 100, allocationSize = 50)
    @GeneratedValue(generator = "userSeqGen")
    private Integer id;

【问题讨论】:

  • 手动设置 ID 绝不是一个好主意,您很容易与现有 ID 发生冲突。为什么需要这样做?

标签: java hibernate spring-data-jpa


【解决方案1】:

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

这意味着您可以为需要手动配置 ID 的用例创建另一个映射到同一个表的实体,并在正常情况下使用带有@GeneratedValue 的实体。

通过使用一些继承设计,你可能会有类似的东西:

@MappedSuperclass
public class Employee  {

    @Column
    private String email;

    @Column
    private String title;
    
    ......
}
@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;
}
@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不能使用,因为您过去已经手动分配了它等)

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 2012-07-24
    • 2014-02-23
    • 1970-01-01
    • 2014-08-22
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多