Mee*_*que 32 inheritance annotations hibernate jpa hierarchy
根据Hibernate参考文档,在使用Hibernate的XML元数据时,应该可以混合使用不同的继承映射策略:http:
//docs.jboss.org/hibernate/stable/core/reference/en/html/inheritance.html#inheritance -混合- tableperclass-tablepersubclass
但是," Hibernate注释参考指南"的相应部分不包括:
http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#d0e1168
另一方面,JavaDocs建议混合继承策略应该是可能的.例如,在javax.persistence.DiscriminatorColumn中,它说:
策略和鉴别器列仅在实体类层次结构或子层次结构的根中指定,其中应用了不同的继承策略.
以下是我试图实现的映射的示例.我想在层次结构的根附近使用table-per-subclass映射,但是更改为叶子附近的table-per-class-hierarchy映射.这是一些示例代码:
@Entity
@Inheritance( strategy = InheritanceType.JOINED )
public abstract class A implements Serializable
{
    @Id
    private String id;
    // other mapped properties...
}
@Entity
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
public class BB extends A
{
    // other mapped properties and associations...
}
@Entity
public class BB1 extends BB
{
    // other stuff, not necessarily mapped...
}
@Entity
public class BB2 extends BB
{
    // other stuff, not necessarily mapped...
}
@Entity
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
public class CC extends A
{
    // other mapped properties and associations...
}
@Entity
public class CC1 extends CC
{
    // other stuff, not necessarily mapped...
}
...
我从这个映射想到的是恰好具有3个表:A,BB,和CC.双方BB并CC应称为默认鉴别列DTYPE.它们还应提供所有映射属性所需的所有列以及它们各自子类的关联.
相反,类层次结构似乎始终使用table-per-subclass继承策略.即我为上面提到的每个实体获得一个自己的表.我想避免这种情况,因为类层次结构的叶子非常轻,而且每个都有一个单独的表似乎有点过分了!
我忽略了什么吗?任何建议都非常感谢!我很乐意提供更多信息......
Pas*_*ent 27
根据Hibernate参考文档,当使用Hibernate的XML元数据(...)时,应该可以混合使用不同的继承映射策略.
实际上,它并没有得到真正的支持,他们使用辅助表来"欺骗"从文档示例中的单表策略切换.用Hibernate引用Java持久性:
您可以通过映射整个嵌套继承层次
<union-subclass>,<sub- class>以及<joined-subclass>映射元素.您不能混用它们 - 例如,从具有鉴别符的每类表层次结构切换到规范化的每子类表策略.一旦你做出继承策略的决定,你就必须坚持下去.然而,这并非完全正确.使用一些Hibernate技巧,您可以切换特定子类的映射策略.例如,您可以将类层次结构映射到单个表,但对于特定的子类,切换到具有外键映射策略的单独表,就像每个子类的表一样.这可以使用
<join>mapping元素:Run Code Online (Sandbox Code Playgroud)<hibernate-mapping> <class name="BillingDetails" table="BILLING_DETAILS"> <id>...</id> <discriminator column="BILLING_DETAILS_TYPE" type="string"/> ... <subclass name="CreditCard" discriminator-value="CC"> <join table="CREDIT_CARD"> <key column="CREDIT_CARD_ID"/> <property name="number" column="CC_NUMBER"/> <property name="expMonth" column="CC_EXP_MONTH"/> <property name="expYear" column="CC_EXP_YEAR"/> ... </join> </subclass> <subclass name="BankAccount" discriminator-value="BA"> <property name=account" column="BA_ACCOUNT"/> ... </subclass> ... </class> </hibernate-mapping>
你可以通过注释实现相同的目的:
Java Persistence还支持带注释的混合继承映射策略.地图超
BillingDetails用InheritanceType.SINGLE_TABLE,像之前.现在将要从单个表中分离出来的子类映射到辅助表.Run Code Online (Sandbox Code Playgroud)@Entity @DiscriminatorValue("CC") @SecondaryTable( name = "CREDIT_CARD", pkJoinColumns = @PrimaryKeyJoinColumn(name = "CREDIT_CARD_ID") ) public class CreditCard extends BillingDetails { @Column(table = "CREDIT_CARD", name = "CC_NUMBER", nullable = false) private String number; ... }
我没有测试过这个,但你可以尝试:
@SecondaryTable注释映射BB,CC等.我没有测试过这个,我不知道它是否适用于BB1,BB2.
Mee*_*que 25
为了清楚起见,这里是Pascal的解决方案应用于我的问题中的示例代码:
@Entity
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn( name = "entityType", 
        discriminatorType = DiscriminatorType.STRING )
public abstract class A implements Serializable
{
    @Id
    private String id;
    // other mapped properties...
}
@Entity
@SecondaryTable( name = "BB" )
public class BB extends A
{
    @Basic( optional = false)
    @Column( table = "BB" )
    private String property1;
    // other mapped properties and associations...
}
@Entity
public class BB1 extends BB
{
    // other stuff, not necessarily mapped...
}
@Entity
public class BB2 extends BB
{
    // other stuff, not necessarily mapped...
}
@Entity
@SecondaryTable( name = "CC" )
public class CC extends A
{
    @ManyToOne( optional = false)
    @JoinColumn( table = "CC" )
    private SomeEntity association1;
    // other mapped properties and associations...
}
@Entity
public class CC1 extends CC
{
    // other stuff, not necessarily mapped...
}
...
我已经成功地将这种方法应用于我的问题,我将暂时坚持下去.但是我仍然看到以下缺点:
discriminator列位于层次结构的主表中,root-enity表A.在我而言,这将是足够了次表的鉴别列BB和CC.
每当有人将属性和关联添加到BB或的子类时CC,他/她必须指定它们应该映射到相应的辅助表.如果有办法使其成为默认值,那就太好了.
| 归档时间: | 
 | 
| 查看次数: | 25951 次 | 
| 最近记录: |