Не удается загрузить объект гибернации из базы данных с отметкой времени

У меня есть сопоставление гибернации с составным первичным ключом, состоящим из ассоциации «многие к одному» и метки времени. Я пытаюсь проверить, находится ли объект уже в базе данных, прежде чем создавать новый. Моя проблема заключается в том, что мой запрос HQL не возвращает объект, хотя он уже находится в базе данных, а затем мое сохранение с точно такими же значениями дает мне:

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.


person anssias    schedule 07.05.2013    source источник


Ответы (1)


Проблема была связана с ошибкой в ​​моем коде, из-за которой myObject не загружался из текущего сеанса гибернации. Чтобы избежать проблем с параллелизмом, я использовал два сеанса, и объект myObject был загружен в другом сеансе, чем тот, в котором я сделал запрос hql.

Я избавился от исключения, загрузив объект в текущем сеансе с помощью:

myObject = (MyObject)db.get(MyObject.class, myObject.getId());
person anssias    schedule 08.05.2013