我使用SequenceGenerator为我的实体生成主密钥。现在有一个用例,其中我需要使用给定的id,而不是序列生成的id。
我尝试根据给定的值设置id字段并保存它,但是自定义id已被序列覆盖。那么,如果指定的id不是null,是否可以告诉hibernate使用给定的id,或者如果id没有显式设置,则使用序列生成一个新的id?
我现在的身份证发生器
@Id
@SequenceGenerator(name = "userSeqGen", sequenceName = "userSeq", initialValue = 100, allocationSize = 50)
@GeneratedValue(generator = "userSeqGen")
private Integer id;发布于 2021-12-13 15:24:07
如果实体的@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,因为您已经将其手动分配给过去的一些记录,等等)。
https://stackoverflow.com/questions/70334654
复制相似问题