前言:
这是一个在SO上经常被问到的问题,答案通常与子类(Subclass)
或实际上是超类(SuperClass)
方法有关(例如[1])。
实际答案:
在这些帖子中[2],[3]他们建议使用带有EntityName
参数的xml映射。
因此,使用xml映射不需要超类,只需将EntityName
参数提供给两个相同的映射即可。
示例映射:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DomainModel.User, DomainModel"
table="User1Object" entity-name="User1Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
<class name="DomainModel.User, DomainModel"
table="User2Object" entity-name="User2Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
</hibernate-mapping>
根据需要的实体类型,您可以调用相应的会话方法,如:
_session.Save("User1Object", user1)
或者
_session.Save("User2Object", user2)
这个片段是基于帖子2和3创建的。官方来源[4]
匹配后:
第一个问题的一个答案实际上链接到这篇文章[5],有不同的方法:
您告别对象的第一个实例,将数据克隆到新实例并使用不同名称持久化。因此,没有违反Hibernate逻辑,每个人都满意:在两个表中具有相同的数据且没有使用子类。
好吧,该方法的实现、代码或可信度都还好,我也没有测试过。
另一种情况:
在这篇文章[
6]中,有另一个人试图用更简单的方法挑战超类方法,但最可靠的答案仍然是无法绕过官方非XML方法,即所谓的子类方法。
来源:
[1]
如何使用Hibernate/JPA注释将一个类映射到不同的表格
[2]
在Hibernate中将两个相同的表(相同模式...)映射到同一实体
[3]
如何将2个相同的表(相同属性)映射到1个实体
[4] http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname}
[5] Hibernate 4:一个类映射两个表 - 如何将一个对象保存在两个表中?
[6] 用于存在于多个目录中的实体的Hibernate注释