【问题标题】:Save an Object using JPA without knowing the parent object在不知道父对象的情况下使用 JPA 保存对象
【发布时间】:2020-02-10 19:56:06
【问题描述】:

我的 JPA 存储库中有 2 个实体,学生和教师。当我使用 find 方法找到一个学生时,我希望相应的老师也能被填充。但是,当我保存一个学生对象时,我只有对应的teacher_id,我没有整个对应的教师对象。我可以使用teacher_id 执行findById,但结果证明成本很高,因为我要保存许多学生对象,每次保存都会导致 2 个数据库调用。

@ManyToOne
@JoinColumn(name="teacher_id")
private Teacher teacher;

【问题讨论】:

  • 您可能想在此处设置使用参考,例如通过Entity.getReference( Teacher.class, teacherId).
  • 不,每次保存都不会调用两次,除非您对某个 Teacher 对象进行变异。只需通过 id 查找 Teacher 并将其设置为参考 - 通常 JPA 甚至会缓存该 Teacher 对象。

标签: java database jpa spring-data-jpa


【解决方案1】:

正如 cmets 所示,我会选择进行新调用并加载整个 Teacher 实体,将其分配给 Student 实体,然后保存。如果您有业务限制(例如每位教师的学生人数上限),请认为您将需要此功能。

话虽如此,要回答您的问题,您可以使用自定义插入 @Query 向您的 JpaRepository 添加一个新方法。类似于此处解释的内容:

https://www.baeldung.com/jpa-insert

类似的东西:

@Transactional
public void insertWithTeacherId(Student student, long teacher_id) {
    entityManager.createNativeQuery("INSERT INTO student (id, teacher_id) VALUES (?,?)")
      .setParameter(1, student.getId())
      .setParameter(2, teacher_id)
      .executeUpdate();
}

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 2023-03-31
    • 2012-07-17
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多