对Jpa中Entity关系映射中mappedBy的理解

mappedBy 单向关系不须要设置该属性,双向关系必须设置,避免双方都创建外键字段数据库中1对多的关系,关联关系老是被多方维护的即外键建在多方,咱们在单方对象的@OneToMany(mappedby="")把关系的维护交给多方对象的属性去维护关系。java


对于mappedBy复习下:
a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
b) mappedBy标签必定是定义在the owned side(被拥有方的),他指向theowning side(拥有方);
c) 关系的拥有方负责关系的维护,在拥有方创建外键。因此用到@JoinColumn
d)mappedBy跟JoinColumn/JoinTable老是处于互斥的一方数据库

这里的维护关联关系,拿多对多来讲就是中间表,在不设置cascade的状况下,中间表由负责维护关联关系的一方维护app

举例说明:ide

Game 和User 两个实体类,他们是多对多的关系,有中间表t_game-user.对象

在User中配置有:blog

@ManyToMany(mappedBy="users")
public List<Game> getGames() {
    return games;
}

Game中配置有:get

@ManyToMany
@JoinTable(name = "t_game_user",
 	joinColumns = {@JoinColumn(name = "game_id",referencedColumnName="gameId")},
 	inverseJoinColumns = {@JoinColumn(name = "user_id",referencedColumnName="id")})
public List<User> getUsers() {
  return users;
}

因此说由Game来维护他们的关联关系,即中间表。表现形式:
1.由于没有配置cascade因此分别给Game,User添加4条数据,而后手动在中间表中添加他们的关联关系
2.在程序中执行删除User
Hibernate: delete from t_user where id=?
Hibernate: delete from t_user where id=?
Hibernate: delete from t_user where id=?
Hibernate: delete from t_user where id=?
删除了User,并无对中间表发生影响class

在程序中执行删除Game
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game where game_id=?
Hibernate:delete from t_game where game_id=?
Hibernate:delete from t_game where game_id=?
Hibernate:delete from t_game where game_id=?
对中间表产生了影响,说明是Game在维护他们之间的关联关系配置

相关文章
相关标签/搜索