对于两个不同的数据库表有两个实体类,有手动生成id的Table1.java
和有序列生成id的Table2.java
,是否可以将id属性,@Id
和@Column
注释以及id的getter和setter移动到GenericTable超类和将@GeneratedValue
和@SequenceGenerator
留在只需要它们的子类中?该解决方案必须可扩展为两种类型的数百个表,并且不应将GenericTable超类拆分为两个类。
问题是@GeneratedValue
仅在字段/方法级别工作,因此必须将其移动到超类,使所有子类必须实现与@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
的另一个子类。