我有接下来的两个实体,它们之间具有 OneToOne 关系:
@Entity
@Table(name = "tasks")
public class Task {
@OneToOne(mappedBy = "task", cascade = CascadeType.PERSIST)
private Tracker tracker;
/* More code */
}
@Entity
@Table(name = "trackers")
public class Tracker {
@OneToOne
@JoinColumn(name = "trk_task", unique = true)
private Task task;
/* More code */
}
我正在尝试运行这段代码:
Task task = taskService.findDispatchableTask();
if (task != null) {
Tracker tracker = trackerService.findIdleTracker();
if (tracker != null) {
task.setTracker(tracker);
task.setStatus(TaskStatus.DISPATCHED);
taskService.save(task);
}
}
但我收到这个错误:
ERROR org.hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: non-transient entity has a null id
我可以“解决”它,将我的代码更改为:
Task task = taskService.findDispatchableTask();
if (task != null) {
Tracker tracker = trackerService.findIdleTracker();
if (tracker != null) {
tracker.setTask(task);
trackerService.save(tracker);
task.setTracker(tracker);
task.setStatus(TaskStatus.DISPATCHED);
taskService.save(task);
}
}
我的问题是,哪种是维持 OneToOne 关系的正确方法?在我的代码中,为什么我要保存关系的两个部分才能使其正常工作?
又来了。
每个双向关联都有两个侧面:所有者侧面和反向侧面。反面是具有mappedBy
属性。业主方是另一方。 JPA/Hibernate只关心所有者方面。因此,如果您只是初始化反面,则关联将不会被持久化。
一般来说,初始化关联双方是一个很好的做法。首先是因为它确保所有者端已初始化,其次是因为它使实体图连贯,这对您有利。
另请注意,如果您在事务中工作(并且您应该),则查询返回的所有实体都是附加实体。当事务提交时(或之前),应用于实体的更改会自动持久化。无需像您所做的那样显式保存实体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)