org.springframework.dao.DataIntegrityViolationException: другой объект с тем же значением идентификатора уже был связан с сеансом - PullRequest
0 голосов
/ 07 апреля 2019

org.springframework.dao.DataIntegrityViolationException: другой объект с тем же значением идентификатора уже был связан с сеансом. Hibernate 5 не заполняет идентификатор временного объекта после сохранения его в базе данных для дочерних родительских отношений.У меня следующая иерархия классов:

public class A{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    ....
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL,  orphanRemoval = true,  mappedBy = "parent")
    private List<B> listB;
    ....
    private C c;
}

public class B{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    ....
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private A parent;
    ....
}

public class C{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    ....
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL,  orphanRemoval = true,  mappedBy = "parent")
    private List<D> listD;
    ....
}

public class D{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    ....
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private C parent;
    ....
}

public interface ADao extends JpaRepository<A, Long>, JpaSpecificationExecutor<A> {}


@Autowired
ADao aDao;

A a = new A();

B b1 = new B();
B b2 = new B();
b1.setParent(a);
b2.setParent(a);

C c = new C();

D d1 = new D();
D d2 = new D();
d1.setParent(c);
d2.setParent(c);

List<B> blist =  new ArrayList<B>();
blist.add(b1);
blist.add(b2);
a.setListB(blist);

List<D> dlist =  new ArrayList<D`>();
dlist.add(d1);
dlist.add(d2);
c.setListD(dlist);

aDao.save(a);

Когда я пытаюсь сохранить объект вроде:

Я получаю следующее исключение

org.springframework.dao.DataIntegrityViolationException: A different object with the same identifier value was already associated with the session : [D#0]; nested exception is javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [D#0]

Кажется, что Hibernate5 не заполняетсяID родителя для child, так как во время отладки даже после операции сохранения я получаю a.getId и c.getId как 0.

До сих пор я пытался установить

hibernate.id.new_generator_mappings=false
session.flush()
session.merge()
session.refresh()
...