个人总结
- 关系字段上加注解 @onetomany或者@manytoone。
- 如果是n-1,那么默认fetch=eager,采用立即查询
- 如果是1-n,默认是延迟加载策略,都可以通过改变fetch属性来改变。
- 单向1-n时,无论如何插入都会多出来两条update语句,因为这时关联关系是由1的一端维护,而外键列在n的一端,需要执行update语句,插入1这一端的id。
- joinColum 来映射相应的外键列列名
- 双向一对多,最好让n的一方维持关系,通过设置mappedType=映射的属性名,而且这时不能设置joinColumn,否则会报错。如果没有设置,那么按照插入顺序,先插1的一端,再插n的一端,会多余两条update语句,先插n的一端,再插1的一端,则会多出来4条update语句,因为这时双方都在维护。
- 而且双向一对多时,两边的joinColumn字段的值应该相一致。
综述
双向一对多关系中,必须存在一个关系维护端,在 JPA 规范中,要求 many 的一方作为关系的维护端(owner side), one 的一方作为被维护端(inverse side)。
可以在 one 方指定 @OneToMany 注释并设置 mappedBy 属性,以指定它是这一关联中的被维护端,many 为维护端。
在 many 方指定 @ManyToOne 注释,并使用 @JoinColumn 指定外键名称
多对一映射
- 和hibernate差不多
- 2.
private Grade grade;
@JoinColumn(name="grade_id")
@ManyToOne(fetch=FetchType.LAZY)
public Grade getGrade() {
return grade;
}
@Test
public void testManyToOne(){
Grade grade=new Grade();
grade.setName("ok");
Student student =new Student();
Student student1 =new Student();
student.setName("good");
student.setGender(1);
student.setEmail("7879");
//设置关联关系
student.setGrade(grade);
student1.setName("gdd");
student1.setGender(1);
student1.setEmail("78de79");
//设置关联关系
student1.setGrade(grade);
entityManager.persist(grade);
entityManager.persist(student);
entityManager.persist(student1);
}
一对多映射
//这时候要去掉joinColumn
@OneToMany(fetch=FetchType.EAGER,mappedBy="grade")
public Set<Student> getStudent() {
return student;
}
@JoinColumn(name="grade_ids")
@OneToMany(fetch=FetchType.EAGER)
public Set<Student> getStudent() {
return student;
}
//测试,这时候只有三条insert语句
@Test
public void TestOneToMany(){
Grade grade=new Grade();
grade.setName("juewei");
Student student =new Student();
Student student1 =new Student();
student.setName("good1");
student.setGender(1);
student.setEmail("7879");
student1.setName("good2");
student1.setGender(1);
student1.setEmail("78de79");
//设定关系
grade.getStudent().add(student1);
grade.getStudent().add(student);
entityManager.persist(grade);
entityManager.persist(student);
entityManager.persist(student1);
}
双向一对多映射
@Test
public void TestOneToManyBetween(){
Grade grade=new Grade();
grade.setName("juewei");
Student student =new Student();
Student student1 =new Student();
student.setName("good1");
student.setGender(1);
student.setEmail("7879");
student.setGrade(grade);
student1.setName("good2");
student1.setGender(1);
student1.setEmail("78de79");
student1.setGrade(grade);
//设定关系
grade.getStudent().add(student1);
grade.getStudent().add(student);
entityManager.persist(grade);
entityManager.persist(student);
entityManager.persist(student1);
}
NullPointerException
问题很简单,没有初始化成员变量set集合,导致给null添加元素
private Set<Student> student;
grade.getStudent().add(student1);
3450

被折叠的 条评论
为什么被折叠?



