Гибернация: исключение Nonuiniqueobjectexception при вставке

#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 в базе данных.