如何使用XML在Hibernate中映射此多态,而无需创建额外的父表?

时间:2010-12-23 17:18:03

标签: hibernate uuid hibernate-mapping

我正在尝试在Hibernate中映射一个POJO树,这样我就可以(a)在任何地方简单地使用UUID作为主键,并且(b)在其他不相关的表之间外部强加类似集合的关系。这似乎使用注释很有效,但对于我的生活,我无法使用HBM XML映射以相同的方式工作。

例如,给出以下(缩写)类:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Unique {
    private String uuid;
}

@Entity
public class Relationship extends Unique {
    @OneToMany
    private Set<Unique> members;
}

@Entity
public class Activity extends Unique {
    private String name;
}

@Entity
public class AssociatedXML extends Unique {
    @Lob
    private String xml;
}

......轻松自大当我运行hbm2ddl时,它会创建表RelationshipRelationship_UniqueActivityAssociatedXML。像以下HQL这样的查询看起来效果很好:

session.createQuery("select xml "
    + "from AssociatedXML as xml, Relationship as rel "
    + "left join rel.members as m "
    + "where m.uuid = :uuid").setString("uuid", activity.getUuid());

与此同时,我正在努力转向XML配置。 POJO是从XML模式生成的。由于源是生成的,我试图避免手动编辑它来添加注释。

我已经尝试了我能想到的每一个XML配置(以及在Hibernate工具中愚弄<hbm2hbmxml/>的输出)。我无法想出一个配置, 创建一个额外的Unique父表,其中包含额外的连接,在会话工厂中失败错误:

  

关联引用未映射的类:唯一

是否有人建议我的XML配置文件应该是什么样的?还是我走错路?

1 个答案:

答案 0 :(得分:1)

这是这样的:

<class name="Unique" abstract = "true">
    <id name="uuid" />

    <union-subclass name="Relationship">
        <set name="members" table = "Relationship_Unique" >
            <key />
            <many-to-many class = "Unique" unique="true"/>
        </set>
    </union-subclass>

    <union-subclass name="Activity">
        <property name = "name" />
    </union-subclass>

    <union-subclass name="AssociaXML">
        <property name = "xml" />
    </union-subclass>
</class>

另见: