srpingdata jpa的一对多
时间: 2023-05-25 11:06:35 浏览: 87
一对多指的是一个实体类拥有多个关联实体类的关系。在Spring Data JPA中,实现一对多关系需要在实体类中使用注解来表示关系。
1. 定义实体类
在一对多关系中,需要定义两个实体类,一个代表主实体类,一个代表子实体类。
主实体类:
```java
@Entity
public class Student {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Course> courses = new ArrayList<>();
}
```
子实体类:
```java
@Entity
public class Course {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "student_id")
private Student student;
}
```
在主实体类`Student`中,使用`@OneToMany`注解定义了与子实体类`Course`的一对多关系。`mappedBy`属性指定了关系的反向属性为子实体类`Course`中的`student`属性。`cascade`属性为级联操作,包括插入、更新和删除。`orphanRemoval`属性为关系的孤儿对象删除,即当主实体类的某个关联子实体类被删除时,该实体类也会被删除。
在子实体类`Course`中,使用`@ManyToOne`注解定义与主实体类`Student`的多对一关系。`fetch`属性为数据抓取策略的定义,`JOIN`表示与主实体类同时查询,`LAZY`表示需要查询时才查询。`@JoinColumn`注解用来定义外键属性,`name`属性为关联主实体类中的属性名。
2. 定义数据访问接口
定义数据访问接口`StudentRepository`:
```java
public interface StudentRepository extends JpaRepository<Student, Long> {
}
```
3. 使用数据访问接口
```java
@Autowired
private StudentRepository studentRepository;
@Transactional
public void test() {
Student student = new Student();
student.setName("张三");
Course course1 = new Course();
course1.setName("语文");
course1.setStudent(student);
Course course2 = new Course();
course2.setName("数学");
course2.setStudent(student);
student.getCourses().add(course1);
student.getCourses().add(course2);
studentRepository.save(student);
Student savedStudent = studentRepository.findById(student.getId()).get();
System.out.println(savedStudent.getCourses().size()); // 2
savedStudent.getCourses().remove(course1);
studentRepository.save(savedStudent);
Student updatedStudent = studentRepository.findById(student.getId()).get();
System.out.println(updatedStudent.getCourses().size()); // 1
}
```
使用事务向数据库中插入数据,查询实体类时,使用`get()`方法。通过关联实体类的属性进行操作,调用`save()`方法持久化数据。查询实体类后,使用集合的`remove()`方法从关联实体类中删除对象,再调用`save()`方法更新数据。