Hibernate 4: One class mapping Two tables - How to persist one object on both tables?

烈酒焚心 提交于 2019-12-22 08:13:25

问题


I have this class Person mapping two tables: Persons and 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>

I'm trying to save this object in the two tables like this:

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

But only the first row is inserted, not the audit row; probably hibernate check the person's state and confirms that is already saved.

Any chance to force hibernate to save in both tables the same object?

Thanks in advance.


回答1:


I would strongly recommend to NOT to do that. It is very confusing. And not only for Hibernate but later it could bring more problems to you (other developer). To make it more clear, please, let's try to think about that issue in the POJO entities (not dynamic model)

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

Session will call insert only once, because there is only one instance. One object with one unique identifier. It cannot be evaluated as anything else then a person.

And the same is happening with your dynamic model. Try to observe your HashMap person after insertion. There should be a key "$type$" which should tell you how is that instance evaluated (as a person). It cannot act as anything else.

Suggested solution:

If you need to save one set information into two tables do it with more orientation to ORM style. E.g. clone the person into new HashMap() and save two independent entities




回答2:


In your second mapping change this

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

to

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


来源:https://stackoverflow.com/questions/13442792/hibernate-4-one-class-mapping-two-tables-how-to-persist-one-object-on-both-ta

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!