Весенний ботинок.Выполнение saveAndFlush с изменением сущности приводит к несохраненному временному исключению - PullRequest
0 голосов
/ 17 апреля 2019

У меня сложная сущность:

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".

1 Ответ

1 голос
/ 17 апреля 2019

saveAndflush не меняет объект на управляемое состояние, вам нужно использовать управляемый объект, возвращаемый этим методом.Попробуйте это решение:

@PostConstruct
private void test() {
   Task task = new Task();
   task = taskDao.saveAndFlush(task);  // reassign
   Executor ex = new Executor();
   List<Property> props = ex.getProperties();
   ... forming and adding some properties
   taskDao.saveAndFlush(task);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...