2012-07-16 109 views
0

我今天发现了这个问题,还没有找到任何解决方案,我现在正在学习如何使用休眠,所以我会尽我所能来解释这种情况。获取相同的对象休眠到不同的对象

我有这个非常简单的类:

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把它们分解成单独的对象吗? ¿某些配置或参数?

在此先感谢!

回答

4

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

如果您想将另一个titularidad指定给您的描述实体,则不应修改现有titularidads的字段。相反,你应该得到你想要分配的titularidad参考,并分配这个参考:

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

好吧,如果这是预期的行为,我就去拿的对象,并在它们分配给我的“Descripcion”更新过程。谢谢! – CocheLee 2012-07-16 08:56:33