JPA一对多映射例子,两边配置:
拥有mappedBy注解的实体类为关系被维护端,另外的实体类为关系维护端的。顾名思意,关系的维护端对关系(在多对多为中间关联表)的CRUD做操作。关系的被维护端没有该操作,不能维护关系。
//被维护端注解
User:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "creater")
private Set
//维护段注解:
Album:
@ManyToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, optional = false)
@JoinColumn(name = "user_id")
private User creater;
(这种配置在从Album端查询所有的Album时会产生数据的无限循环获取,造成笛卡尔积重复。因为每个Album中包含了creater,而creater中又有一个Album集合。。。)
mappedBy表明由第二个所在的类维护关系,。 如何反转?mappedBy相当于inverse="true";如果想让第一个维护,可以不写这个,按照如下配置:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set
删除第二个类中的creater。
这时会生成一张中间表用于维护关系。