【问题标题】:Hibernate 4: One class mapping Two tables - How to persist one object on both tables?Hibernate 4:一个类映射两个表 - 如何在两个表上保留一个对象?
【发布时间】:2024-01-11 11:09:01
【问题描述】:

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

 <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 save hbmxml


    【解决方案1】:

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

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

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

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

    建议的解决方案:

    如果您需要将一组信息保存到两个表中,请更倾向于 ORM 样式。例如。 cloneperson 变成new HashMap() 并保存两个独立的实体

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 感谢您的回答,我也尝试过这个映射,但它不起作用,仍然只保存第一行。
      最近更新 更多