今天用到了hibernate作为持久层框架,表关系中设计到多对多的关系,考虑一下觉得有两条路子可以走,
1,建立中间表的实体类,存入多对多两个表的id,这样,这样在建立这两个表的实体类时不需要进行映射配置了。
2,不建立中间表的实体类,在两个多对多的表上建立映射关系。
下面说一下第二种方式:这里会用到mappedBy,以下是借鉴别人对mappedBy的理解
1.@mappedBy 属性简单理解为设定为主表(这只是我个人理解,上面文章中也有提到过)
所以另一端则需要设置外键@JoinColumn(name="fk_id")
2.@OneToMany 注解下返回Set集合(列如:上帝可以有多个信徒)。
3.@ManyToOne 注解下 设置外键 根据 外键获取到主表对象只能获取到一个对象(列如:信徒只能有一个上帝)。
主表(God)
Java代码 收藏代码
private Set believer= new HashSet(0);
public void setBeliever(Set<Believer> believer){
this.believer= believer;
}
@OneToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.LAZY, mappedBy = "God")
public Set<Believer> getBeliever() {
return believer;
}
从表(Believer)
Java代码 收藏代码
private God god;
public void setGod(God god){
this.god= god;
}
@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "godid",nullable = false, insertable = false, updatable = false)
})
public God getGod() {
return god;
}
然后在说一下
hibernate多对多中间表数据生成详解
//用户类中角色映射关系
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable( name="loginuser_role", joinColumns = @JoinColumn(name = "userAccout"),
inverseJoinColumns = @JoinColumn(name = "roleID"))
private List<Role> role = new ArrayList<Role>();
- //角色类用户映射关系
- @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "role")
- private List<LoginUser> loginUser = new ArrayList<LoginUser>();
代码详细说明略过,主要说明什么时候,中间表会存数据。代码解释如下:
// 中间表插入了数据
//用户service层
UserService service = (UserService)ctx.getBean("userService");
//用户
LoginUser u = new LoginUser();
u.setUserName("sdkjf");
u.setUserPasswd("sdf");
u.setUserAccout("d");
//角色
Role r = new Role();
r.setRoleLeve(3);
r.setRoleName("sdklf");
List<Role> t = new ArrayList<Role>();
t.add(r);
//把角色加到用户
u.setRole(t);
service.add(u);//保存
//中间表没有插入数据
//角色service
RoleService service = (RoleService) ctx.getBean("roleService");
//角色
Role r = new Role();
r.setRoleLeve(3);
r.setRoleName("sdklf");
//用户
LoginUser u = new LoginUser();
u.setUserName("sdkjf");
u.setUserPasswd("sdf");
u.setUserAccout("d");
List<LoginUser> lu = new ArrayList<LoginUser>();
lu.add(u);
//设置用户
r.setLoginUser(lu);
service.add(r);//保存
为何出现这样的情况,简单说明,因为在角色类中使用了mappedBy指向了用户对象中的role,这样的意思就是只能通过用户操作来做中间表(用户角色表)维护工作。如果不这样做,如上代码通过角色来做维护的时候,中间表是不会做任何数据修改工作的。
自己吐槽:1.为何hibernate做了这样的限制后,通过角色还能用户角色本表的插入工作,不提示任何错误,但是中间表就是没值(大神指教)
2.和第一问很相似,为何单单插入用户或者单单插入角色是可以的(就是我插入用户的时候我不设置角色,插入角色的时候我不设置用户。。。能成功,并且没有任何提示)。。。既然我设置了关系,应该每一个插入都是有校验的。。。不理解,大神指教
下面那些都是借鉴别人的文章,觉得很好,怕忘记了,便收集在一起,供自己及更多人使用。
写完这篇文章之后,突然有一种感觉:我们不写文章,我们只是文章的搬运工,哈哈哈。
//用户类中角色映射关系
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable( name="loginuser_role", joinColumns = @JoinColumn(name = "userAccout"),
inverseJoinColumns = @JoinColumn(name = "roleID"))
private List<Role> role = new ArrayList<Role>();
// 中间表插入了数据
//用户service层
UserService service = (UserService)ctx.getBean("userService");
//用户
LoginUser u = new LoginUser();
u.setUserName("sdkjf");
u.setUserPasswd("sdf");
u.setUserAccout("d");
//角色
Role r = new Role();
r.setRoleLeve(3);
r.setRoleName("sdklf");
List<Role> t = new ArrayList<Role>();
t.add(r);
//把角色加到用户
u.setRole(t);
service.add(u);//保存
//中间表没有插入数据
//角色service
RoleService service = (RoleService) ctx.getBean("roleService");
//角色
Role r = new Role();
r.setRoleLeve(3);
r.setRoleName("sdklf");
//用户
LoginUser u = new LoginUser();
u.setUserName("sdkjf");
u.setUserPasswd("sdf");
u.setUserAccout("d");
List<LoginUser> lu = new ArrayList<LoginUser>();
lu.add(u);
//设置用户
r.setLoginUser(lu);
service.add(r);//保存
为何出现这样的情况,简单说明,因为在角色类中使用了mappedBy指向了用户对象中的role,这样的意思就是只能通过用户操作来做中间表(用户角色表)维护工作。如果不这样做,如上代码通过角色来做维护的时候,中间表是不会做任何数据修改工作的。
自己吐槽:1.为何hibernate做了这样的限制后,通过角色还能用户角色本表的插入工作,不提示任何错误,但是中间表就是没值(大神指教)
2.和第一问很相似,为何单单插入用户或者单单插入角色是可以的(就是我插入用户的时候我不设置角色,插入角色的时候我不设置用户。。。能成功,并且没有任何提示)。。。既然我设置了关系,应该每一个插入都是有校验的。。。不理解,大神指教