当前位置: 首页 > 面试题库 >

使用SpringData JPA保持OneToOne关系

子车灿
2023-03-14
问题内容

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

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

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



 类似资料:
  • 问题内容: 在我们正在开发的此应用程序中,我们注意到一个视图特别慢。我剖析了该视图,并注意到,即使数据库中只有两个对象要获取,也执行了一个查询,该查询花费了10秒。所有和关系都是懒惰的,所以这不是问题。在检查实际执行的SQL时,我注意到查询中有80多个联接。 在进一步检查该问题时,我注意到该问题是由实体类的深入层次结构和实体类之间的关系引起的。所以,我想,我只是让它们变得懒惰,应该可以解决问题。但

  • 我有和。他们有一个不可撤销的关系。 如何查询具有空的所有对象? 因为如果我这样做: JPA引擎在两个表之间进行连接,并放置一个无用的WHERE子句()。恢复时,它会执行一个无用的本机SQL。怎么能 当前解决方案: 阅读OpenJPA文档时,我发现应该使用本机查询来解决JPA的限制。我可以很容易地使用本机查询,我目前正在这样做,但我想避免使用它。

  • 问题内容: 在我们正在开发的此应用程序中,我们注意到一个视图特别慢。我对视图进行了概要分析,发现即使数据库中只有两个对象要获取,hibernate也执行了一个查询,该查询花费了10秒。所有和关系都是懒惰的,所以这不是问题。在检查实际执行的SQL时,我注意到查询中有80多个联接。 在进一步检查该问题时,我注意到该问题是由实体类的深入层次结构和实体之间的关系引起的。所以,我想,我只是让它们变得懒惰,应

  • 问题内容: 也许这是一个愚蠢的问题,但这困扰了我。 我有一个从员工到车辆的双向一对多关系。当我第一次将Employee保留在数据库中时(即它没有分配的ID),我也希望保留其关联的Vehicles。 目前,这对我来说很好,除了我保存的Vehicle实体没有自动映射关联的Employee,并且在数据库中Vehicle表中的employee_id外键列为空。 我的问题是,是否可以在雇员本身被保留的同时保

  • 问题内容: 我试图保持一个非常简单的单向一对多关系,但是EclipseLink(2.3.1)失败。 服务等级(家长): 参数类(子级):( 当然,数据库中有“ service_id”外键字段,由于它是单向关系,因此未在类中表示)。 这是实体持久性的代码: 我得到这个异常: 编辑:由于数据的性质,数据库字段具有(并且应该具有)非空约束。 这是错误还是代码有问题? 问题答案: 尝试删除参数表的serv

  • 想改进这个问题吗 通过编辑此帖子,添加详细信息并澄清问题。 我想进行联调。我目前的方法: 我放置了@AutoConfigreMockMvc,但MockMvc对象仍然为空