如何在使用基本实体时使用休眠注释,派生实体有不同的列要映射



我读了这个问题:使用基本实体的休眠注释

它提到将@MappedSuperclass与@Id一起使用。

@MappedSuperclass
class BaseEntity {
    @Id
    private int id;
    //getters and setters.
}
@Entity
class Movie extends BaseEntity {
    @Column
    private String name;
    @Column
    private int year;
    @Column
    private int durationMins;
    //getters and setters
}

但是,如果我有多个派生实体扩展 BaseEntity,并且派生实体表对基实体中定义的列具有不同的列名称,该怎么办?例如:

@Entity
@Table(name = "A")
class A extends BaseEntity {
}
@Entity
@Table(name = "B")
class B extends BaseEntity {
}
而在表 A 中,id 列称为">

A_id",而在表 B 中,id 列称为"B_id"。如何配置基实体中 id 列的映射,以便它映射到派生实体中的不同列?

您可能希望在此处使用AttributeOverride来基本上强制实施相对于相关实体类的特定语义。

@Entity
@Table(name = "A")
@AttributeOverride(name = "id", @Column(name = "a_id"))
public class A extends BaseEntity {
}
@Entity
@Table(name = "B")
@AttributeOverride(name = "id", @Column(name = "b_id"))
public class B extends BaseEntity {
}

您通常会发现AttributeOverride的真正好处是定义@Embeddable注释类的概念。 例如:

@Embeddable
public class StockingDetails {
  private Integer minQuantity;
  private Integer maxQuantity;
  // other attributes
}
@Entity
public class Product {
  // other attributes 
  @Embedded
  @AttributeAssociations({
    @AttributeOverride(name = "minQuantity", column = @Column(name = "some_min")),
    @AttributeOverride(name = "maxQuantity", column = @Column(name = "some_max"))
  })
  private StockingDetails someTypeOfDetails;
  @Embedded
  @AttributeAssociations({
    @AttributeOverride(name = "minQuantity", column = @Column(name = "other_min")),
    @AttributeOverride(name = "maxQuantity", column = @Column(name = "other_max"))
  })
  private StockingDetails otherDetails;
}

当您想要单个实现但具有相同结构的不同数据库表示形式时,它非常有用。

最新更新