Hibernate和JPA有什么好的继承策略?

时间:2010-07-31 23:32:23

标签: java hibernate inheritance jpa annotations

我遇到这种情况:

我有一个实体Person,其中包含一个人的所有个人详细信息,例如出生日期,街道地址,市政府ecc ecc。 我有一个实体ClubMember描述俱乐部的成员,并包含一些字段:注册日期,成员类型,信用,ecc ecc

所以,ClubMemberPerson,我认为是正确的,用继承来描述: ClubMember extends Person,但是,什么类型的策略?

我会在数据库中获得两个表PersonClubMember,其中ClubMember包含id_person,如@OneToOne关系,但保持两者之间的继承实体;这是可能的(也是正确的)?

JOINED是与我的目标最接近的策略,但我丢失了表ID的{​​{1}}字段,实际上ClubMember成为表格的ID ID ...

3 个答案:

答案 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映射策略表。

http://docs.jboss.org/hibernate/stable/core/reference/en/html/inheritance.html#inheritance-tableperclass