hibernate @mappedBy小记

来源:互联网 发布:武汉软件新城派出所 编辑:程序博客网 时间:2024/05/19 19:58

今天用到了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>();  

  1. //角色类用户映射关系  
  2.     @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "role")  
  3.     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.和第一问很相似,为何单单插入用户或者单单插入角色是可以的(就是我插入用户的时候我不设置角色,插入角色的时候我不设置用户。。。能成功,并且没有任何提示)。。。既然我设置了关系,应该每一个插入都是有校验的。。。不理解,大神指教


下面那些都是借鉴别人的文章,觉得很好,怕忘记了,便收集在一起,供自己及更多人使用。
写完这篇文章之后,突然有一种感觉:我们不写文章,我们只是文章的搬运工,哈哈哈。


1 0
原创粉丝点击