对于Jpa中Entity关系映射中mappedBy需要全面理解,可以按照以下攻略进行:
1. 什么是mappedBy?
在Jpa中,当一个实体类A与另一个实体类B产生关联时,需要进行定义。这种定义一般是通过在一个实体类中定义一个属性,该属性上使用@OneToMany、@OneToOne、@ManyToMany等注解实现的。而在另一个实体类中对应的属性通常会使用@ManyToOne或@ManyToMany注解进行标注。两个实体类通过这些注解进行关联之后,其中一个实体类上就需要使用mappedBy属性进行相应的配置。
mappedBy在Jpa中表示“由对方关系维护”,这个属性通常出现在关系的被维护端(如@OneToMany注解中的集合属性上)。也就是说,mappedBy指定的属性不再保存关系,而是表示关系被对方维护。
2. mappedBy的作用是什么?
mappedBy的作用有以下两种:
2.1 避免关系维护出现问题
在Jpa中,两个实体类之间建立关联通常需要指定关系维护端和关系被维护端。通过mappedBy指定关系被维护端,可以实现避免关系维护出现问题的效果。因为如果两个实体类都指定关系维护端,则会导致Jpa在数据更新时无法确认如何进行关系维护,从而导致程序出现异常。
2.2 提高操作效率
使用mappedBy指定关系被维护端可以提高操作效率。当关系被维护端进行更新时,Jpa会自动忽略该端的更新操作,避免因为重复进行更新操作而导致的效率降低。
3. mappedBy的使用注意事项
在使用mappedBy时需要注意以下几点:
3.1 mappedBy属性必须与关系维护端的属性名称相同
在使用mappedBy属性时,必须指定关系维护端的属性名称。这个属性名称必须与关系维护端的属性名称相同。
3.2 mappedBy属性只能用在一对多、多对一和多对多的关系映射中
mappedBy属性只能用于一对多、多对一和多对多的关系映射中,而不能用于一对一的关系映射中。
3.3 mappedBy属性不能与@JoinColumn一块使用
mappedBy属性不能与@JoinColumn一块使用,因为这样会导致Jpa对关系映射进行错误解释。
4. mappedBy的示例
4.1 一对多映射中的例子
以下是一对多关系映射中的例子,假设一个学校有多个班级,一个班级有多个学生,学生实体类中使用@ManyToOne注解来定义关系维护端,班级实体类中使用@OneToMany注解来定义mappedBy属性,指定关系被维护端:
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "Clazz_id")
private Clazz clazz;
// 省略其它属性和方法
}
@Entity
public class Clazz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "clazz")
private List<Student> students;
// 省略其它属性和方法
}
在上面的代码中,Student实体类使用@ManyToOne注解来定义关系维护端,指定了JoinColumn name="Clazz_id"。Clazz实体类使用@OneToMany注解来定义mappedBy属性,指定关系被维护端。
4.2 多对多映射中的例子
以下是多对多关系映射中的例子,假设一个订单可以有多种产品,而一个产品也可以被多个订单包含。在通过@ManyToMany注解将订单与产品关联之后,使用mappedBy属性指定该注解在产品实体类中的属性名称,代码如下:
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderNo;
@ManyToMany
@JoinTable(name = "order_product",
joinColumns = @JoinColumn(name = "order_id"),
inverseJoinColumns = @JoinColumn(name = "product_id"))
private List<Product> products;
// 省略其它属性和方法
}
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(mappedBy = "products")
private List<Order> orders;
// 省略其它属性和方法
}
在上面的代码中,Order实体类使用@ManyToMany注解定义关系维护端,使用@JoinTable注解来定义中间表,其中joinColumns指定该实体类在中间表中对应的外键名,inverseJoinColumns指定关联实体类在中间表中对应的外键名。Product实体类使用@ManyToMany注解来定义关系被维护端,使用mappedBy属性指定相关属性为“products”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:对Jpa中Entity关系映射中mappedBy的全面理解 - Python技术站