gpt4 book ai didi

java - Hibernate 将 @Id 字段重构为父类(super class)

转载 作者:行者123 更新时间:2023-11-30 06:53:20 36 4
gpt4 key购买 nike

对于两个不同的数据库表有 2 个实体类,Table1.java 具有手动生成的 id,Table2.java 具有序列生成的 id,是否可以移动id 属性、@Id@Column 注释以及 id 的 getter 和 setter 到 GenericTable 父类(super class),并保留 @GenerateValue@SequenceGenerator 位于只需要它们的子类中?该解决方案必须能够针对两种类型的数百个表进行扩展,并且不应将 GenericTable 父类(super class)拆分为两个类。

问题是 @GenerateValue 仅在字段/方法级别工作,因此必须将其移至父类(super class),从而使所有子类强制实现与以下内容冲突的 @SequenceGenerator Table1.java 特征。

@Entity
@Table(name = "TABLE1")
public class Table1 extends GenericTable {

@Id
@Column(name = "ID", nullable = false, precision = 22, scale = 0)
private Long id;

// other properties
// getters & setters for id
// other getters & setters
}

@Entity
@Table(name = "TABLE2")
public class Table2 extends GenericTable {

@Id
@GeneratedValue(strategy = SEQUENCE, generator = "generator")
@SequenceGenerator(name = "generator", sequenceName = "TABLE2_SEQ", allocationSize = 1)
@Column(name = "ID", nullable = false, precision = 22, scale = 0)
private Long id;

// other properties
// getters & setters for id
// other getters & setters
}

@MappedSuperclass
public abstract class GenericTable {

}

最佳答案

我认为不可能将这两种配置类型塞进一个类中。

我做了一些测试,通过两个 @MappedSuperclass 实体,您应该能够实现满足您可重用/可扩展需求的解决方案:

基本 ID 类型父级

@MappedSuperclass
public abstract class BasicIdAwareEntity implements Serializable {

protected Long id;

@Id
@Column(name = "ID", nullable = false, precision = 22, scale = 0)
public Long getId() {
return id;
}

序列 ID 变异父级

@MappedSuperclass
public abstract class SequenceIdAwareEntity extends BasicIdAwareEntity {

@Override
@Id
@GeneratedValue(strategy = SEQUENCE, generator = "generator")
@SequenceGenerator(name = "generator", sequenceName = "TABLE2_SEQ", allocationSize = 1)
public Long getId() {
return super.getId();
}

具体实体

@Entity
@Table(name = "TABLE1")
public class Table1 extends BasicIdAwareEntity {

@Entity
@Table(name = "TABLE2")
public class Table2 extends SequenceIdAwareEntity {

现在,如果您需要在将来的某个时候重构此映射,例如您需要更改 id 列的精度,那么您只需在 BasicIdAwareEntity 类中进行更改即可。类型更改也是如此,在良好的 IDE 的帮助下也应该更改子类。

您需要在所有抽象类中放入的唯一注释是 @Id。

如果您将来需要为某个表使用不同的生成器,那么您只需创建 BasicIdAwareEntity 的另一个子类即可。

关于java - Hibernate 将 @Id 字段重构为父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42309662/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com