Hibernate中,mappedBy和注解@JoinColumn的对比

mappedBy

我们知道,mappedBy用于指定具有双向关系的两个实体中。哪个实体是被关联处理的。它有如下四个特点:

1.只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;

[email protected](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关系。但还要根据实际情况加以选择。

时间: 2024-10-18 23:54:02

Hibernate中,mappedBy和注解@JoinColumn的对比的相关文章

Hibernate中使用@Lob 注解保存String[] 问题

Hibernate中使用@Lob 注解保存String[] 问题 在Hibernate注解中如何你想保存一个字段为String数组类型,如果你想尝试保存为clob类型的话,一般情况下为定义为: @Entity Public class Person { - @Lob String[] stringArray; -. } 多数时候当你自动创建表的时候,Hibernate会告诉你Json无法转换或者类转换错误,原因在于你保存text类型文本,Hibernate只接受String类型的,当你定义为St

。。。Hibernate中mappedBy属性。。。

今天在学习Hibernate中,感觉这个mappedBy这个注解属性有点小难度.不过理解之后,还是阔以的! 首先,mappedBy这个注解只能够用在@OntToOne,@OneToMany,@manyToMany中,不能够用在@manyToOne中: 第二,这个注解看网上的意思可以简单地理解为:这个注解用在主表的一方,就是被引用的一方: 第三,这个注解是与@JoinColumn这个注解是互斥的,因为@JoinColumn这个注解使用在拥有外键的表的一方,就是从表的一方. 第四,这个注解的属性值是

Hibernate中的一些注解的学习

1.@Column注解 就像@Table注解用来标识实体类与数据表的对应关系类似,@Column注解来标识实体类中属性与数据表中字段的对应关系. @Column注解一共有10个属性,这10个属性均为可选属性,各属性含义分别如下: name name属性定义了被标注字段在数据库表中所对应字段的名称: unique unique属性表示该字段是否为唯一标识,默认为false.如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint. nul

Hibernate中的Annotation注解与XML配置的使用

通过XML配置来实现持久化: 首先我们来建立一个实体类: package com.hibernate.model; public class Student {     private int id;     private String name;     private int age;          public int getId() {         return id;     }     public void setId(int id) {         this.id 

hibernate中实体类注解

一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出. Target({METHOD,FIELD}) @Retention(RUNTIME) public @interface GeneratedValue{ G

hibernate 中如何用注解映射定长字符类型char(2)

如果是用xml的方式配置映射,可以在<column>标签的sql-type属性中设置char(2),比如: 1 <property name="age" type="java.lang.String"> 2 <column name="age" sql-type="char(2)"></column> 3 </property>   如果是注解的话,需要使用@Colu

Annotation(二)——Hibernate中注解的开发

在利用注解开发数据库持久层以前,需要学习一个规范JPA(Java Persistence API),这也是SUN公司提出的数据库的持久化规范.就类似于JDBC,Servlet,JSP等规范一样.而Hibernate框架就实现了此规范,我们可以通过注解和配置文件来实现此规范.前边的学习都是建立在配置文件的基础上,而注解开发现在也处于一种趋势,毕竟它大大提高了开发速度. 看一下注解在Hibernate框架中的开发知识. 一,首先需要导入支持注解开发的jar包: hibernate-annotatio

Hibernate中的注解说明

Hibernate中注解注解比较多,常用的也就那么几个,在这里把Hibernate中的注解汇总总结一下. @Entity:将一个类声明为一个实体bean,即一个持久化POJO; @Id:声明bean的标识属性,即和表中的主键对应的属性: @Table:声明bean映射数据库中指定的表: @Column:声明bean的属性到表的列的映射,该注解还有以下属性: name:可选,属性要映射的列明,如果属性名和列名相同则可以省略: unique:可选,是否在该列上设置唯一约束,默认值为false: nu

Hibernate中注解的开发

在利用注解开发数据库持久层曾经,须要学习一个规范JPA(Java Persistence API),这也是SUN公司提出的数据库的持久化规范. 就类似于JDBC.Servlet,JSP等规范一样.而Hibernate框架就实现了此规范,我们能够通过注解和配置文件来实现此规范.前边的学习都是建立在配置文件的基础上,而注解开发如今也处于一种趋势.毕竟它大大提高了开发速度. 看一下注解在Hibernate框架中的开发知识. 一.首先须要导入支持注解开发的jar包: hibernate-annotati