使用SpringData JPA保持OneToOne关系

我接下来的两个实体之间具有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只关心所有者方面。因此,如果仅初始化反面,则关联将不会保留。

通常,初始化关联的两端都是一个好习惯。首先是因为它确保所有者端已初始化,其次是因为它使实体图具有连贯性,这是为了您自己的利益。

还要注意,如果您正在事务中(并且应该这样做),则查询返回的所有实体都是附加的实体。提交事务时(或之前),将自动使应用于实体的更改持久化。无需像您所做的那样明确地保存实体。

以上是 使用SpringData JPA保持OneToOne关系 的全部内容, 来源链接: utcz.com/qa/435051.html

回到顶部