休眠每个实体的两个表

我有一个实体 - .它由 描述。UserUser.class

Hibernate 为每个实体创建一个表,因此当我调用 时,我的数据始终保存到此表中。session.save(user)

现在,我需要另一个表来存储相同类型的数据,并且我只需要将我的实体保存到该表中。User

数据结构(类似如下):

table users_1_table{
  string id;
  string username;
}

table users_2_table{
  string id;
  string username;
}

使用这个

session.save(user1,"users_1_table")
session.save(user2,"users_2_table")

结果我应该在 和 .user1users_1_tableuser2users_2_table

由于系统限制,我无法将这两个对象放在一个表中。(即使创建额外的字段也是坏主意)。

我可以在不进行子类化的情况下执行此操作吗?使用编程休眠配置?


答案 1

前言:

即使在SO上,这也是一个被广泛问到的问题,而且答案也与实际方法相关或实际方法(例如[1SubclassSuperClass])

实际答案:

在这些帖子[2],[3]中,他们建议使用带有参数的xml映射。EntityName

因此,使用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] 如何使用休眠/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] 存在于多个目录中的实体的休眠注释


答案 2

此外,它还使用默认实体和替代实体工作:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
   <class name="DomainModel.User, DomainModel"
     table="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(user1)

_session.Save("User2Object", user2)

对于替代项。


推荐