mappedBy和@JoinColumn的相似和区别

1、在使用@OneToMany注解的时候 为了让One知道Many中的对象那个字段来关联自己的时候,我们可以用@OneToMany的mappedBy指向一个对象变量或者@JoinColumn指向One的一个外键字段。

 

例如:一个年级有多个学生就是 其中年级(one) 学生(many)

 

//学生
public class Student {

	@ManyToOne
	@JoinColumn(name = "grade_id")
        private Grade	grade;
 
        //get和set方式省略
}

 

  

   mappedBy方式:

//年级
public class Grade {
	@OneToMany(mappedBy = "grade", cascade = CascadeType.ALL)
	private Set<Student>	students;
	get和set方式省略

}

   

 以上是通过Grade 通过@OneToMany注解通过mappedBy指定了集合中的对象Student是通过grade属性   关 联到Grade的。

同时设置了cascade 为 CascadeType.ALL,当某个grade中进行操作时也会级联对集合中student进行同样的操作,需要注意的是必须为集合中的student设置garde属性为当前需要操作的grade,,否则新增的student的外键为空。

 

    @JoinColumn方式:

public class Grade {

	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "grade_id")
	private Set<Student>	students;

	//get和set方式省略

}

 

以上是通过Grade是通过声明@JoinColumn指定了集合中的Student通过外键grade_id关联到当前的Grade的,当设置Cascade的时候,当对某个grade进行某种操做时也会级联对集合中的student进行同样的操作,同时还会对集合中新增的对象进行一次upade操作,以保证集合中的对象有外键关键到当前对象,因此可以不一定要设置student指向grade.

需要注意的时,如果没有设置级联,但是集合中有未保存的student,对grade进行操作时,会报异常,org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before

 

综上所述:其实用mappedBy 更好,当进行级联操作时,不会发出更多的update语句来维护many中的对象和one关系。

类似这样的SQL语句:

update
        t_student 
    set
        grade_id=? 
    where
        id=?

 

  

  

 

 

 

你可能感兴趣的:(OneToMany)