如何使用XML在Hibernate中映射这种多态性,而无需创建额外的父表?
-
12-10-2019 - |
题
我正在尝试在冬眠中绘制一棵Pojos树,以便我可以(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时,它会创建表格 Relationship
, Relationship_Unique
, Activity
, , 和 AssociatedXML
. 。像以下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配置。 Pojos是由XML模式生成的。由于生成了源,因此我试图避免手工编辑以添加注释。
我已经尝试了我能想到的每种XML配置(并欺骗了 <hbm2hbmxml/>
在冬眠工具中)。我不能想出一个没有的配置 任何一个 创建另一个 Unique
涉及额外加入的父桌, 或者 在会话工厂失败的错误:
协会参考文献未倍增类:唯一
有人对我的XML配置文件的外观有建议吗?还是我走一条糟糕的道路?
解决方案
这样的事情:
<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>
也可以看看:
不隶属于 StackOverflow