在使用基本实体和派生实体时,如何使用Hibernate注释来映射不同的列?

在使用基本实体和派生实体时,如何使用Hibernate注释来映射不同的列?,hibernate,annotations,Hibernate,Annotations,我阅读了关于这一点的问题: 它提到了将@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

我阅读了关于这一点的问题:

它提到了将@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 {
}
@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;
}

而在表A中,id列称为A_id,在表B中,id列称为B_id。如何配置baseentity中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的真正好处是定义了@Embeddeble注释类。例如:

@Entity
@Table(name = "A")
class A extends BaseEntity {
}

@Entity
@Table(name = "B")
class B extends BaseEntity {
}
@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;
}

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

Wow,这正是我想要的!谢谢!