gpt4 book ai didi

java - Spring 启动。执行 saveAndFlush 并修改实体结果为未保存的 transient 异常

转载 作者:行者123 更新时间:2023-12-02 09:59:39 24 4
gpt4 key购买 nike

我有一个复杂的实体:

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

一般是一个‘Task’,它组成一个‘Executor’,‘Executor’中填充一些特定的属性。

如果我以常规方式执行此操作,则意味着:

@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...),所以我怀疑是否忘记指定“Cascade”。

最佳答案

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

关于java - Spring 启动。执行 saveAndFlush 并修改实体结果为未保存的 transient 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55730170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com