JPA: объединить @OneToMany Ошибка повторяющегося ввода - PullRequest
0 голосов
/ 25 августа 2010

Я всегда получаю следующую ошибку:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '2-1' for key 'PRIMARY'
Error Code: 1062
Call: INSERT INTO ENTITY_ENTITY (relationships_ID, Entity_ID) VALUES (?, ?)
    bind => [1, 2]
Query: DataModifyQuery(sql="INSERT INTO ENTITY_ENTITY (relationships_ID, Entity_ID) VALUES (?, ?)")

Мои классы выглядят так:

@javax.persistence.Entity
public class Entity {


    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    protected Long id;

    @Column(nullable=false, updatable=false)
    protected String name;

    @OneToMany(cascade=CascadeType.MERGE)
    protected Collection<Entity> relationships = new ArrayList<Entity>();
}

Один экземпляр этого класса может ссылаться на другие экземпляры того же типа (self-referencing).Теперь при создании одного экземпляра, который ссылается на другой, все работает нормально.Но проблема в том, что когда такой экземпляр (отсоединенный - я не совсем уверен, потому что экземпляр редактируется с помощью формы Facelets) обновляется, то есть имя, то путем выполнения операции слияния EntityManager исключение - как упомянуто выше -

РЕДАКТИРОВАТЬ:
1. Создайте один экземпляр сущности (например, E1).
2. Сохраните E1 через em.persist (E1).
3. Позже создайте еще один экземпляр Entity (E2), который переопределяет E1 через свойство Relations .
4. И сохраните E2: em.persist (E2).

-- До сих пор все отлично работает.

Загрузите для просмотра всех сохраненных экземпляров сущности и выберите E2 для редактирования (через веб-интерфейс Facelet). Измените, например, имя E2. Чтобы сохранить изменения: Вызовите em.merge (E2).

--- Теперь выдается исключение!

END EDIT

Что не так с моим кодом?Пожалуйста, помогите мне !!!

1 Ответ

3 голосов
/ 26 августа 2010

Кажется, что способ отсоединения / объединения ваших объектов каким-то образом портит объект, чтобы иметь две ссылки на одну и ту же сущность, или думать, что ссылка является новой, когда она существовала. Это вызывает вставку в таблицу соединений OneToMany, которая является дубликатом и вызывает нарушение ограничения.

При попытке отладки или проверки состояния коллекции на каждом этапе добавляется ли к ней дубликат экземпляра?

Возможно, это может быть связано с кэшированием или отслеживанием изменений. Вы можете попробовать отключить общий кеш, обновить объект или отключить переплетение.

http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching#How_to_refresh_the_cache

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#How_to_Disable_Weaving_Using_EclipseLink_Persistence_Unit_Properties

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...