В EclipseLink я сталкиваюсь с проблемой, когда элемент вставляется дважды, что приводит к нарушению первичного ключа.Сценарий таков: у меня есть три объекта: Элемент, Ограничение и Ограничение. Элемент.Объект RestrictionElement действует как отношение «многие ко многим» между двумя другими.Когда я создаю новый RestrictionElement и объединяю Элемент, RestrictionElement вставляется дважды.Код:
// element is an Element, restriction is a Restriction. Both are already in present in the database.
RestrictionElement newRestrictionElement = new RestrictionElement(restriction, element);
Transaction transaction = new Transaction();
em.merge(element); //em is the EntityManager
transaction.commit();
Однако, если я удаляю строку restriction.getReferencedRestrictionElements().add(this);
, RestrictionElement вставляется один раз.Кто-нибудь может объяснить, почему это происходит?Или укажите документ, который объясняет, как определить, что делает команда merge ()?
Соответствующий код JPA: (Я приведу лишь небольшую часть. Других больших проблем с кодом нет..)
public class RestrictionElement {
@JoinColumns({@JoinColumn(name = "ELEMENT_ID", referencedColumnName = "ID"),@JoinColumn(name = "ELEMENT_DESCRIPTOR", referencedColumnName = "DESCRIPTOR")})
private Element element;
@JoinColumns({@JoinColumn(name = "RESTRICTION_ID", referencedColumnName = "ID"),@JoinColumn(name = "RESTRICTION_DESCRIPTOR", referencedColumnName = "DESCRIPTOR")})
private Restriction restriction;
public RestrictionElement(Restriction restriction, Element element) {
this.restriction = restriction;
this.element = element;
restriction.getReferencedRestrictionElements().add(this);
element.getReferingRestrictionElements().add(this);
}
}
public class Element {
@OneToMany(mappedBy = "element")
private List<RestrictionElement> referingRestrictionElements = new ArrayList<RestrictionElement>();
}
public class Restriction extends Element {
@OneToMany(mappedBy = "restriction", cascade = { ALL, PERSIST, MERGE, REMOVE, REFRESH })
private List<RestrictionElement> referencedRestrictionElements = new ArrayList<RestrictionElement>();
}