У меня была эта проблема в течение нескольких дней, я попробовал все решения. Поэтому я прошу здесь, возможно, за дополнительную помощь. У меня есть родительский класс и дочерний класс, связанные двунаправленным способом. Я прилагаю код:
@Entity
@Table(name="PARENT")
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PARENT_SEQ")
@SequenceGenerator(name="PARENT_ID_GENERATOR", allocationSize = 1, sequenceName="PARENT_SEQ")
private Long id;
@OneToMany(fetch = FetchType.LAZY, mappedBy="parent", cascade = CascadeType.ALL)
private List<Child> childList;
//getter and setter ......
и этот потомок:
@Entity
@Table(name="CHILD")
public class Child implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CHILD_SEQ")
@SequenceGenerator(name="CHILD_ID_GENERATOR", allocationSize = 1, sequenceName="CHILD_SEQ")
private Long id;
@Column(name="NAME")
private String name;
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "ID_CHILD")
private Parent parent;
//getter and setter ......
В тот момент, когда я делаю это:
@Autowired
ParentService parentService;
......
Parent parent = new Parent();
//various parent setters
List<Child> childList= new ArrayList<Child>();
for (Employee employee: listEmployee.getEmployee()) {
Child child = new Child();
child.setNome(employee.getNome());
childList.add(child)
}
parent.setChildList(childList)
parentService.save(parent);
Я получаю эту ошибку:
Caused by: javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session
Это мой сервис:
@Autowired
ParentRepository parentRepository;
.......
@Transactional
public void save(Parent parent) {
parentRepository.save(parent);
}
Звучит как каскадная проблема, но если я изменяюсь с помощью MERGE, мой родитель спасает меня, но не моего ребенка.
Это моя последовательность одинакова для обоих, меняя только имя:
CREATE SEQUENCE "CHILD_SEQ" MINVALUE 1 MAXVALUE 1000000000000000000000000000 INCREMENT BY 1 START WITH 41 CACHE 20 NOORDER NOCYCLE ;
Спасибо всем, кто может мне помочь.