`
星夜的遐想
  • 浏览: 189408 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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=?

 

  

  

 

 

 

分享到:
评论

相关推荐

    hibernate 关系注解

    双向一对一关系需要在两个实体类中都使用`@OneToOne`,一方使用`mappedBy`属性引用另一方的属性。例如: ```java // 在User类中 @OneToOne(mappedBy="user") private Profile profile; // 在Profile类中 @...

    hibernate各种常用关联关系的基本配置

    配置时使用`@OneToMany`注解,可设置`mappedBy`、`fetch`(默认为EAGER,可改为LAZY实现懒加载)和`cascade`(级联操作)等属性。 ```java @Entity public class User { @OneToMany(mappedBy = "user", cascade = ...

    Hibernate注释

    - **示例**:假设有一个班级类(`Class`)和一个学生类(`Student`),其中`Student`类中定义了`@ManyToOne`类型的`class`字段,则`Class`类中可以使用`@OneToMany(mappedBy = "class")`来定义一对多关系。...

    Hibernate 注解一对多,多对一

    1. 在使用`@OneToMany`时,如果没有指定`mappedBy`,那么在父类中需要使用`@JoinColumn`指定外键字段,并且这个字段通常会在数据库中创建一个索引。 2. 当使用`FetchType.LAZY`时,需要确保JPA实现支持懒加载,例如...

    Hibernate关于注解的一对多,多对多,一对一

    你可以指定`mappedBy`属性来指定子类中的反向关联字段,这通常是多端的`@ManyToOne`注解的引用字段。 2. **@JoinColumn** 或 **@JoinTable**:对于一端,我们通常需要使用`@JoinColumn`注解来指定外键所在的列,...

    Hibernate的三种关系映射例子演示

    这里的`mappedBy`属性用于指定外键位于哪个实体,而`@JoinColumn`则用于指定外键所在的表和列名。 2. 一对多关系映射(One-to-Many) 在一对多关系中,一个实体可以对应多个其他实体的实例。例如,一个班级(Class...

    Hibernate 的多对一、一对多、多对多

    使用`@ManyToOne`注解,并配合`@JoinColumn`来指定外键列的名称和引用的主键。 ```java @Entity public class Employee { @ManyToOne @JoinColumn(name = "department_id") private Department department; // ...

    Hibernate实体关联速查表

    这可以通过`@OneToOne`注解实现,可配置`mappedBy`属性来指定关联的反向字段。例如: ```java @Entity public class User { @OneToOne(mappedBy = "user") private Profile profile; } @Entity public class ...

    hibernate 一对一 多对多的关系

    在上述代码中,`@OneToOne`注解用于声明一对一关系,`mappedBy`属性表示反向关联,而`@JoinColumn`则指定了关联字段的名称。 #### 外键(ForeignKey) ```java @Entity public class User { @Id @GeneratedValue...

    Hibernate表关系总结(一对一,多对一,多对多)

    - 单向:一个实体类包含另一个实体类的引用,通过`@OneToOne`注解和`@JoinColumn`指定外键字段。 - 双向:两个实体类互相引用,使用`mappedBy`属性指定双向关系的主导方。 ```java @Entity @Table(name = "_...

    JPA一对一,一对多,多对多关系映射

    - 可以通过`mappedBy`属性指定被引用方,否则需在双方实体上定义关系。 - `@JoinColumn`注解用于指定外键列名和主键关联。 例如: ```java @Entity public class User { @Id private Long id; @OneToOne(mapped...

    hibernate 关联例子

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) private Profile profile; } @Entity public class Profile { @OneToOne @JoinColumn(name = "user_id") private User user; } ``` 这里,User和...

    hibernate表关联实例

    @OneToOne(mappedBy = "person") private IdCard idCard; } @Entity public class IdCard { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne @JoinColumn(name = ...

    hibernate one-to-many 单/双向关联映射配置心得

    1. 在父类(“一”的一方)的映射文件或注解中,定义`@OneToMany`注解,指定子类的实体类和集合类型,并设置`mappedBy`属性,指明子类中引用父类的字段。 ```java @Entity public class Parent { @OneToMany...

    hibernate常用一对一、一对多、多对一、多对多映射关系真实例子(华南银行项目)

    @OneToOne(mappedBy = "account") private Customer customer; } @Entity public class Customer { @OneToOne @JoinColumn(name = "account_id") private Account account; } ``` **一对多映射(One-to-Many...

    hibernate关联映射

    关联可以是单向或双向,单向关联只需在一方定义,双向关联则需要在双方都定义,并且需要设置`mappedBy`属性来指定主表。 ```java @Entity public class Person { @OneToOne(mappedBy = "person") private ...

    Hibernate 关联映射

    @OneToOne(mappedBy = "user") private Account account; } @Entity public class Account { @Id private Long id; @OneToOne @JoinColumn(name = "user_id") private User user; } ``` **2. 一对多关联...

    Hibernate 注解映射

    * 双向一对多映射:在多端使用 @ManyToOne 和 @JoinColumn 注解,在一端使用 @OneToMany 和 mappedBy 注解,指定关联属性名。 * 双线一对一映射:基于外键使用 @OneToOne 注解,基于主键使用 Hibernate 的扩展注解。...

    Hibernate双向一对一关联映射(注解版)

    通常,我们会指定一方作为“拥有者”(通过`mappedBy`),另一方不声明`mappedBy`,以防止循环引用。 3. **初始化关联对象**:在使用双向一对一关联时,确保在需要时正确初始化并设置双方的引用,否则可能引发空...

Global site tag (gtag.js) - Google Analytics