我遇到这种情况:
我有一个实体Person
,其中包含一个人的所有个人详细信息,例如出生日期,街道地址,市政府ecc ecc。
我有一个实体ClubMember
描述俱乐部的成员,并包含一些字段:注册日期,成员类型,信用,ecc ecc
所以,ClubMember
是Person
,我认为是正确的,用继承来描述:
ClubMember extends Person
,但是,什么类型的策略?
我会在数据库中获得两个表Person
和ClubMember
,其中ClubMember
包含id_person
,如@OneToOne
关系,但保持两者之间的继承实体;这是可能的(也是正确的)?
JOINED
是与我的目标最接近的策略,但我丢失了表ID
的{{1}}字段,实际上ClubMember
成为表格的ID
ID
...
答案 0 :(得分:4)
Blow,在选择某种继承策略时,你应该保持性能问题。 Here您可以看到有关可用继承策略的良好见解。不要忘记继承可以作为关联重写如下
而不是
public class A {}
public class B extends A {}
你可以使用
public class B {
private A a;
}
或者您可以使用MapedSuperClass使用任何Hibernate / JPA继承策略映射所有继承的属性whitout。见here
在使用默认的JPA / Hibernate注释时请记住,Hibernate总是获取所有子类。如果您有单一层次结构,则更喜欢使用单表继承策略。如果您拥有复杂层次结构,则会更好地设计加入策略,但在查询任何实体时会遇到性能问题。
答案 1 :(得分:1)
编辑:以下答案假设为NHibernate,如果它不适用于Hibernate,请事先道歉
这并不总是微不足道的,即使它可以简单地实施(见下文),也应该彻底考虑。根据我的经验,最好坚持良好的旧聚合,甚至只是场地,每个ClubMember都有一个人,而不是一个人。这可能并不完全感觉正确,但它可以更轻松地使用您的配置,CRUD操作和您的抽象DAO类。自动映射工具通常不支持开箱即用的子类化。
此外,与您的数据库和DAL一起工作的人员将了解此映射(即,Person作为与ClubMember的一对一映射,向Person
添加非null - 属性,你也有你的约束),因为它更接近数据库。当然,您可能会争辩说ORM的整个想法是消除这种相似性;)。
如果您想在此路径上进行试验,或者您希望了解它是如何完成的并将其应用于您的情况,Ayende has a nice blog on the subject of NHibernate and inheritance。这有点基础,但你会明白的。如果您使用Fluent NHibernate,它会变得更容易一些,请参阅this brief tutorial。
答案 2 :(得分:0)
我会按照你的建议让ClubMemeber扩展Person,并使用每个类的heriarchy映射策略表。