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 楼答案
saveAndflush
不会将实体更改为托管状态,您需要使用此方法返回的托管实体。尝试以下解决方案: