Hibernate中,mappedBy和注解@JoinColumn的对比
2017-08-27 20:53
561 查看
Hibernate中,mappedBy和注解@JoinColumn的对比
mappedBy
我们知道,mappedBy用于指定具有双向关系的两个实体中。哪个实体是被关联处理的。它有如下四个特点:1.只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
2.@OneToMany(mapped=“由One的一方指向Many的一方,并且,这个属性应该等于Many的一方中含有One类的属性的对象名,否则会出错”)
3.关系的拥有方(即Many的一方)负责关系的维护,在拥有方建立外键。所以用到@JoinColumn
4.mappedBy跟JoinColumn/JoinTable总是处于互斥的一方
mappedBy和@JoinColumn的对比
但是,在使用@OneToMany注解的时候,为了让One知道Many中的对象的哪个字段来关联自己的时候,在Many的一方,我们既可以用@OneToMany的mappedBy指向一个对象变量,也可以用@JoinColumn指向One的一个外键字段。例如:一个年级有多个学生,其中显然是:年级(one)学生(many)
学生(ManyToOne):
1 //学生 2 public class Student { 3 4 @ManyToOne 5 @JoinColumn(name = "grade_id") 6 private Grade grade; 7 8 //get和set方式省略 9 }
年级(OneToMany):
mappedBy方式:
1 //年级 2 public class Grade { 3 4 @OneToMany(mappedBy = "grade", cascade = CascadeType.ALL) 5 private Set<Student> students; 6 7 //get和set方式省略 8 }
以上Grade使用@OneToMany注解通过mappedBy指定了集合中的对象Student是通过grade属性关联到Grade的。
同时设置了cascade为CascadeType.ALL,当某个grade中进行操作时也会级联对集合中student进行同样的操作,需要注意的是必须为集合中的student设置garde属性为当前需要操作的grade,否则新增的student的外键为空。
@JoinColumn方式:
1 public class Grade { 2 3 @OneToMany(cascade = CascadeType.ALL) 4 @JoinColumn(name = "grade_id") 5 private Set<Student> students; 6 7 //get和set方式省略 8 }
以上Grade是通过声明@JoinColumn指定了集合中的Student通过外键grade_id关联到当前的Grade的,当设置Cascade的时候,当对某个grade进行某种操做时也会级联对集合中的student进行同样的操作,同时还会对集合中新增的对象进行一次update操作,以保证集合中的对象有外键关键到当前对象,因此可以不一定要设置student指向grade。
需要注意的是,如果没有设置级联,但是集合中有未保存的student,对grade进行操作时,会报异常,org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before
当进行级联操作时,相当于发出了如下的update语句来维护many中的对象和one关系:
update t_student set grade_id=? where id=?
查阅资料对比得知,或许用mappedBy更好,因为当进行级联操作时,不会发出更多的update语句来维护many中的对象和one关系。但还要根据实际情况加以选择。
作者:xuwenyuan
出处:http://www.cnblogs.com/ShawnYuki/
本文版权
aeb2
归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- Hibernate中,mappedBy和注解@JoinColumn的对比
- Hibernate中,mappedBy和注解@JoinColumn的对比
- Hibernate中,mappedBy和注解@JoinColumn的对比
- Hibernate,JPA注解@PrimaryKeyJoinColumn
- hibernate注解异常:java.lang.NoSuchMethodError javax.persistence.JoinColumn.foreignKey()Ljavax/persistenc
- Hibernate中mappedBy和@JoinColumn二者的使用心得
- Hibernate主键一对一关联映射实例【xml和注解版本@OneToOne@JoinColumn(name="wifeId")--主键单向】(十二)
- Hibernate属性中 @JoinColumn与@JoinTable、是否使用ForeignKey的操作数据库的效率区别
- Hibernate 一对一、一对多、多对多注解mappedBy属性的总结
- Hibernate 一对多注解 mappedby 作用
- Hibernate 一对多注解 mappedby 作用
- Hibernate 注解@Column(nullable = false) 和 @Column(unique=true)
- HIbernate 注解 mappedBy 与 inverse
- hibernate--错误:javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey
- hibernate 中注解 一对多 主键中mappedBy的具体使用及其含义
- Hibernate不能使用@Table和@JoinColumn的问题
- Hibernate @Column 注解失效 原因分析
- 码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable
- mappedBy跟JoinColumn/JoinTable .
- Hibernate用columnDefinition注解给实体属性设置默认值