2013-05-07 82 views
0

我有一个包含多对一关联和时间戳的复合主键的hibernate映射。我正在尝试在创建新对象之前检查对象是否已经在数据库中。我problemn是,虽然它已经在数据库中,然后我用完全相同的值保存我的HQL查询不返回对象给我:无法从数据库加载具有时间戳的hibernate对象

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 

我的HQL查询是这样的:

db.createQuery("from DataCache dc where dc.myObject = :mo AND dc.timestamp = :date").setParameter("mo", this).setParameter("date", timestamp).uniqueResult(); 

查询不带时间戳部分。我试图添加TimestampType.INSTANCE到setParameter方法,但似乎没有任何工作。

DataCache.hbm.xml

<composite-id> 
     <key-many-to-one name="myObject" column="my_object" class="...MyObject" lazy="false"/> 
     <key-property name="timestamp" type="timestamp" column="timestamp"/> 
</composite-id> 

我使用MySQL 5.6和Hibernate 4.1.9。

回答

0

该问题与我的代码中的错误有关,其中myObject未从当前休眠会话加载。为了避免并发性问题,我使用了两个会话,myObject实体在与创建hql查询不同的会话中加载。

我被用在当前会话中加载实体摆脱了异常:

myObject = (MyObject)db.get(MyObject.class, myObject.getId()); 
相关问题