Hibernate重构@Id字段到超类

问题描述 投票:1回答:1

对于两个不同的数据库表有两个实体类,有手动生成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 {

}
java hibernate jpa inheritance orm
1个回答
1
投票

我不认为可以在一个类中填充这两种配置类型。

我做了一些测试,并且使用两个@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的另一个子类。

© www.soinside.com 2019 - 2024. All rights reserved.