Я alwways получаю следующее сообщение об ошибке:JPA: Слияние @OneToMany Дубликат ошибка ввода
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>();
}
Один экземпляр этого класса может ссылаться на другие экземпляры тот же тип (саморегуляция). Теперь, создавая один экземпляр, который ссылается на другой, все работает нормально. Но проблема в том, когда такой (отсоединенный - я не совсем уверен, потому что экземпляр редактируется через форму Facelets) экземпляр обновляется, то есть имя, а затем, выполняя операцию слияния EntityManager, исключение - как упоминалось выше - бросается.
РЕДАКТИРОВАТЬ:
1. Создать один экземпляр Entity (т.е. Е1).
2. Персистировать E1 через em.persist (E1).
3. Позже создайте еще один экземпляр объекта (E2), который refreneces E1 через свойство отношения.
4. И сохраняйте E2: em.persist (E2).
--- До сих пор все работает нормально.
- Загрузить, чтобы просмотреть все сохраненные экземпляры Entity и выбрать E2 для редактирования (через веб-интерфейс Facelet).
- Изменение, то есть имя E2.
- Для сохранения изменений: Позвоните em.merge (E2).
--- Теперь Исключение брошено!
END EDIT
Что случилось с моим кодом? Пожалуйста, помогите мне !!!
Можете ли вы показать некоторые (псевдо) код для всего потока и зафиксировать отображение (или название)? –