Spring Data JPA Quick Guide
  • Spring Data JPA 快速指南
  • 配置依赖
  • 配置数据源
  • 数据库编码与词语定序
  • Core Concepts
  • 基本用法
  • Transactions
    • 什么是事务
    • 配置事务(@EnableTransactionManagement)
    • 配置事务(XML)
    • 配置事务(@Transactional)
    • @Transactional 实现细节
    • Transaction and Spring Data JPA
    • 事务隔离
    • 事务传播
  • Query Creation from Method Names
  • Using @Query
  • Sorting and Pagination
  • Projection
  • Specification
  • Query by Example
  • javax.persistence Annotations
    • @OneToOne (bidirectional)
      • Usage
      • PO Serialization
      • Save and Update
      • Nested Projection
      • @MapsId
    • @OneToMany (bidirectional)
    • @OneToMany (unidirectional)
    • @ManyToMany (bidirectional)
      • Many-to-Many Using a Composite Key
由 GitBook 提供支持
在本页
  1. javax.persistence Annotations
  2. @OneToOne (bidirectional)

Save and Update

要存储拥有一对一关系(双向)的实体,作以下操作:

因为依赖关系,我们需要先存储 Student:

@PostMapping("/add")
public void addStudent(@RequestBody Student student) {
    student.setId(null);
    student.setTuition(null);
    studentRepository.save(student);
}

存储 Student 时,我们不希望前端设置 id,因为 id 是由 Hibernate 自动生成才对。同时,我们不希望在此时存储 Tuition,因为 Tuition.student_id 依赖于 Student 的 id,而 Student 的 id 还未经自动生成,所以无法对 Tuition.student_id 赋值。

然后,我们可以存储 Tuition 信息:

@PostMapping("/setaddr")
public void setStudentAddress(@RequestBody Tuition tuition,
                              @RequestParam Long studentId) {
    Student student = studentRepository.findById(studentId).get();
    tuition.setId(null);
    student.setTuition(tuition);
    tuition.setStudent(student);
    studentRepository.save(student);
    // tuitionRepository.save(tuition);
}

虽然 Hibernate 和 Spring Data JPA 已经非常智能,我们仍然需要自己维护依赖关系。

我们先从数据库拉取 studentId 对应的 Student 实体对象,将其 tuition 设置为传参进来的 tuition,同时把 tuition 的 student 也设置为拉取的 student。这样一来一对一关系就被我们维护的很好了,而 Tuition 的 id 为自动生成,不应该指定。

由于 student 和 tuition 都各自拥有关系的全部信息,所以 save(student) 或者 save(tuition) 都是可以的。

上一页PO Serialization下一页Nested Projection

最后更新于3年前