Как @ManyToOne(cascade = CascadeType.ALL) может влиять на INSERT

Поддерживаю легаси код. Столкнулся следующей проблемой:

Есть класс

class Person {
    ...

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "PARENT_ID")
    private Person parentPerson;

    @OrderBy("id ASC")
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentPerson")
    private Set<Person> childPersons;

    ...
}

Объекты создаются следующим образом:

@Transactional(
    propagation = Propagation.REQUIRES_NEW,
    rollbackFor = {ApplicationException.class, SystemException.class}
)
public void createChildPerson(Person parentPerson) {
    Person childPerson = new Person();
    childPerson.setParentPerson(parentPerson);
    ...
    personDao.saveOrUpdate(childPerson);

    parentPerson.getChildPersons().add(childPerson);
}

Если метод выполняется одновременно в 3 потоках, childPerson создаются и записываются в базу.
Если метод выполняются 7 потоках, некоторые childPerson не записываются в базу, но программа может выполняться, так как сами объекты находятся в кэше. Никаких ошибок или исключений в логах не вижу.

Если я поменяю класс Person следующим образом:

class Person {
    ...

    @ManyToOne()
    @JoinColumn(name = "PARENT_ID")
    private Person parentPerson;

    @OrderBy("id ASC")
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentPerson", cascade = CascadeType.ALL)
    private Set<Person> childPersons;

    ...
}

CascadeType.ALL переместил с @ManyToOne в @OneToMany
В этом случае все работает, не зависимо от количество потоков, количество childPerson-ов, все записываются в базу.

Вопрос: Каким образом CascadeType.ALL для @ManyToOne мешает выполнится INSERT-у в базе ?


Ответы (0 шт):