У меня сложная сущность:
public class Task {
@OneToOne(orphanRemoval=true, mappedBy="parent")
@Cascade(value = CascadeType.ALL) (org.hibernate.annotations ... package)
private Executor executor;
...
}
public class Executor {
@OneToOne
@JoinColumn
private Task parent;
@ManyToOne
@Cascade(value = CascadeType.ALL)
private List<Property> propList = new LinkedList<Property>();
}
Обычно это «Задача», которая образует «Исполнитель», а «Исполнитель» заполняется некоторыми специфическими свойствами.
Если я делаю это регулярно, то есть:
@Service
public class Service {
@PostConstruct
private void test() {
Task task = new Task();
Executor ex = new Executor();
List<Property> props = ex.getProperties();
... forming and adding some properties
taskDao.saveAndFlush(task);
}
Все в порядке, и Задача становится правильно сохраненной.
Но так как это упрощено, и мне нужно сохранить Задачув тот момент, когда я получаю единицу, то есть сразу после определения, и сохраняю ее (очистка, отсутствие очистки, разделение на отдельный метод с транзакциями),
@Service
public class Service {
@PostConstruct
private void test() {
Task task = new Task();
taskDao.saveAndFlush(task); // no change in the exception if I properly move this out to a separate method with @Transactional
Executor ex = new Executor();
List<Property> props = ex.getProperties();
... forming and adding some properties
taskDao.saveAndFlush(task);
}
Я получаю «несохраненную транзакцию», котораяуказывая на второй «saveAndFlush».
И это возможно только в том случае, если я заполняю «Свойства», что означает, что, закомментировав часть «формирующие свойства», все работает хорошо.
Каскадis ALL (полный список, хранится в org.hibernate.annotations ...), поэтому я сомневаюсь, что забыл указать "Cascade".