#java #hibernate
#java #впадать в спящий режим #спящий режим
Вопрос:
Пытаюсь вставить новый объект, используя hibernate, и он выдает мне это исключение:
a different object with the same identifier value was already associated with the session
Я понимаю, что эта ошибка возникает из-за того, что hibernate находит аналогичный объект в памяти. Но я создаю новый объект каждый раз перед вставкой. Имеет ли это какое — то отношение к sequence
?
хбм
<class name="MyObject" table="My_Object">
<id column="object_id" name="id" type="long">
<generator class="sequence">
<param name="sequence">OBJ_SEQ</param>
</generator>
</id>
<property name="column1" column="column_1" type="string" not-null="true"/>
<property name="column2" column="column_2" type="string" not-null="true"/>
<property name="column3" column="column_3" not-null="true" type="string"/>
</class>
Комментарии:
1. Может быть, ваш
MyObject
класс перезаписываетequals()
иhashcode()
, и эта реализация не ссылается наobject_id
? В этом случае hibernate может найти объект в кэше сеанса, который «равен» вашему новому объекту, хотя на самом деле он другой?2. Джек может быть прав, но просто предостережение: если вы добавите идентификатор в свои методы hashcode / equals, это может иметь свой собственный набор опасностей. Идентификатор будет равен нулю при первом создании экземпляра объекта (предположительно, до его вставки в БД и генерации идентификатора), А затем любые коллекции (например, хэш-карты, хэш-наборы и т.д.), В которых существует объект, могут не «найти» его после изменения идентификатора (после вставки) из-за того, что хэш-код отличается во время вставки и во время поиска.
Ответ №1:
Проблема в том, что когда вы пытаетесь сохранить объект, объект с таким же идентификатором уже присутствует в базе данных. Причиной этого может быть то, что вы вручную присваиваете значение идентификатору, или вы сбросили OBJ_SEQ в базе данных.