Как @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-у в базе ?