hibernate @mappedBy小记

今天用到了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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值