Hibernate 4:一个类映射两个表 - 如何在两个表上保留一个对象?

时间:2012-11-18 17:47:45

标签: hibernate save hbmxml

我有这个类Person映射两个表:Persons和PersonsAUD(audit):

 <class catalog="test" name="test.Person" table="Persons" entity-name="Person">
    <id name="id" type="int">
      <column name="Id"/>
      <generator class="increment"/>
    </id>
    <property name="name" type="string">
      <column length="30" name="Name" not-null="true"/>
    </property>
    ...    

  </class>

  <class catalog="test" name="test.Person" table="PersonsAUD" entity-name="PersonAUD">

    <id name="idAudit" type="int">
      <column name="IdAudit"/>
      <generator class="increment"/>
    </id>      

    <property name="name" type="string">
      <column length="30" name="Name" not-null="true"/>
    </property>
    <property name="action" type="string">
      <column length="10" name="Action" not-null="true"/>
    </property>
    ...
  </class>

我正在尝试将这个对象保存在这两个表中:

session.save("Person", person);
session.save("PersonAUD", person);

但只插入第一行,而不是审计行;可能是休眠检查人的状态并确认已经保存。

是否有机会强制hibernate在两个表中保存相同的对象?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我强烈建议不要这样做。这非常令人困惑。而且不仅仅是为了Hibernate而且它可能会给你带来更多问题(其他开发人员)。为了更清楚,请让我们尝试在POJO实体中考虑该问题(不是动态模型)

Person person = new Person();
// fill properties
session.save(person); // as a person
session.save(person); // as a person audit 

Session只会调用一次插入,因为只有一个实例。一个具有一个唯一标识符的对象除了之外,它不能被评估为其他任何东西。

动态模型也是如此。插入后,请尝试观察HashMap 。应该有一个键“$type$”,它应该告诉您该实例是如何评估的(作为)。它不能起到任何其他作用。

建议的解决方案:

如果您需要将一组信息保存到两个表中,请使用ORM样式的更多方向。例如。将{em>人 clone导入new HashMap()并保存两个独立实体

答案 1 :(得分:0)

在你的第二个映射中 改变这个

<id name="idAudit" type="int">

<id name="id" type="int">