有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javaspringboot。执行saveAndFlush并将实体结果修改为未保存的trancient异常

我有一个复杂的实体:

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”

这只有在我填写属性的情况下才能实现,这意味着注释掉“形成属性”部分,一切都很好

级联就是全部(完整列表,保存在org.hibernate.annotations…),所以我对忘记指定“级联”表示怀疑


共 (1) 个答案

  1. # 1 楼答案

    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);
    }