time : 2014年5月24日12:35:56
mappedBy 用来指定那一方是控制方,控制方能对被控制方进行维护。
注意: 双向映射必设mappedBy,mappedby只能出現在@oneToOne,@oneToMany,@ManyToMany一方,
不能出現在@ManyToOne一方,把多的一方设置为控制方。
例子:
说明:t_user 和 t_role 是多对多关联。
t_user表:
@ManyToMany(mappedBy = "userSet",cascade=CascadeType.REFRESH,fetch=FetchType.LAZY)
private Set<Role> roleSet = new HashSet<Role>();
t_role表:
@ManyToMany
@JoinTable(name="user_role",joinColumns={@JoinColumn(name="role_id")},inverseJoinColumns={@JoinColumn(name="user_id")})
private Set<User> userSet = new HashSet<User>();
(还有一张关联user_role表)
在t_user表的多对多设置了mappedBy="userSet"(对应t_role表中的userSet)
看下面例子,向关联表user_role中添加记录:
@Test
public void updateUser_role(){
//由user来维护中间表,发现中间表的数据并没有添加进去。
// User user = userDao.load(3L);
// Set<Role> roles = new HashSet<Role>();
// roles.add(roleDao.load(2L));
// user.setRole(roles);
// userDao.update(user);
//由role来维护中间表,添加成功
Role role = roleDao.load(1L);
User user = userDao.load(3L);
Set<User> users = new HashSet<User>();
users.add(user);
role.setUser(users);
roleDao.update(role);
}
说明: user这边设置了 mappedby = “userSet”属性,它指的是role类里面的Set<User> userSet
* 此处的意思就是说,user是被控制方,role是控制方。他们的中间表的数据应该是由控制方来维护,也就是说由role来维护。
* 所以在添加数据时会出现下列问题:
* user = User.setRole(roleSet);
* userDao.update(user)或者save(user) 中间表的数据会添加不了。这就是原因所在之处。
* 如果这样:
* role = role.set(userSet);
* roleDao.update(role)或者save(role) 中间表的数据就会被添加进去。