将同一对象Hibernate提取到不同的对象

时间:2012-07-16 08:06:06

标签: java hibernate

我今天发现了这个问题并且还没有找到任何解决方案,我现在正在学习如何使用hibernate,所以我会尽力解释这种情况。

我有一个非常简单的课程:

public class Descripcion {
    private long id;
    private String descripcion;
    private AuxTitularidad titularidad = new AuxTitularidad();
    private AuxTitularidad titularidad2 = new AuxTitularidad();

    //getters and setters below... all of them auto-generated
}

这是我的映射文件

<class name="Descripcion" table="DESCRIPCION">
    <id name="id" type="long" column="id">
        <generator class="identity"></generator>
    </id>
    <property name="descripcion" column="descripcion"/>
    <many-to-one name="titularidad" class="AuxTitularidad" column="id_titularidad1"  />
    <many-to-one name="titularidad2" class="AuxTitularidad" column="id_titularidad2"/>
</class>

这个映射对我有用,除非“titularidad”和“titularidad2”具有相同的值(引用同一个对象),否则完全没有问题。当发生这种情况时,hibernate只需获取AuxTitularidad类的单个对象,并将其用于“titularidad”和“titularidad2”。

如果我只是为了阅读而取出它们应该不是问题,但是我需要使用HTML表单进行更新,并且因为“Descripcion”的实例持有两个对“AuxTitularidad”的相同实例的引用“,它只保留一个值。

示例:

数字1:这些是我的数据库中存储的值:

 titularidad: 17
 titularidad2: 23

所以我使用HTML表单进行更新,并为它们分配这些新值:

 titularidad: 30
 titularidad2: 28

作品!

数字2:这些是我的数据库中存储的值:

 titularidad: 18
 titularidad2: 18

所以我使用HTML表单进行更新,并为它们分配这些新值:

 titularidad: 12
 titularidad2: 32

不起作用。它将其保存在DB中:

 titularidad: 32
 titularidad2: 32

我已经检查了HTML表单中对象的绑定,这是正确的,我知道问题是“titularidad”和“titularidad2”都持有对同一个对象的引用(甚至看过id对象)。 ¿无论如何告诉hibernate将它们分成不同的对象? ¿某些配置或参数?

提前致谢!

1 个答案:

答案 0 :(得分:4)

这是预期的行为。在给定的会话中,给定的实体只存在一次。

如果要将另一个titularidad分配给描述实体,则不应修改现有titularidads的字段。相反,您应该获得要分配的titularidad的引用,并指定此引用:

Titularidad newTitularidad = session.load(Titularidad.class, newTitularidadId);
Titularidad newTitularidad2 = session.load(Titularidad.class, newTitularidad2Id);
descripcion.setTitularidad(newTitularidad);
descripcion.setTitularidad2(newTitularidad2);