我读了这个问题:使用基本实体的休眠注释
它提到将@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;
}
当您想要单个实现但具有相同结构的不同数据库表示形式时,它非常有用。