Hibernate中的inverse在表关系映射中经常应用,

Hibernate中的inverse在表关系映射中经常应用,
  inverse的值有两种,“true”和“false”。inverse="false"是默认的值,如果设置为true 则表示对象的状态变化不会同步到数据库 ;设置成false则相反;
  inverse的作用:在hibernate中是通过inverse的设置来决定是有谁来维护表和表之间的关系的。
  我们说inverse设立不当会导致性能低下,其实是说inverse设立不当,会产生多余重复的SQL语句甚至致使JDBC exception的throw。这是我们在建立实体类关系时必须需要关注的地方。一般来说,inverse=true是推荐使用,双向关联中双方都设置 inverse=false的话,必会导致双方都重复更新同一个关系。但是如果双方都设立inverse=true的话,双方都不维护关系的更新,这也是 不行的,好在一对多中的一端:many-to-one默认是inverse=false,避免了这种错误的产生。但是多对多就没有这个默认设置了,所以很 多人经常在多对多的两端都使用inverse=true,结果导致连接表的数据根本没有记录,就是因为他们双分都没有责任维护关系。所以说,双向关联中最 好的设置是一端为inverse=true,一端为inverse=false。一般inverse=false会放在多的一端,那么有人提问了, many-to-many两边都是多的,inverse到底放在哪儿?其实hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一个连接表。所以通用存在一对多的关系,也可以这样说:一对多是多对多的基本组成部分。
 

   其中还有一段时cascade和inverse的区别

 

写道
cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。
  inverse只对set+one-to-many(或many-to-many)有效,对many-to-one, one-to-one无效。cascade对关系标记都有效。
  inverse对集合对象整体起作用,cascade对集合对象中的一个一个元素起作用,如果集合为空,那么cascade不会引发关联操作。

 而在binernate的文档里也写有

 

写道
Very Important Note: If the <key> column of a <one-to-many> association is declared NOT NULL, Hibernate may cause constraint violations when it creates or updates the association. To prevent this problem, you must use a bidirectional association with the many valued end (the set or bag) marked as inverse="true".

所以要是在Userinfo.hbm.xml没设置inverse的话,它默认的是false,那么它就会把级联关系刷新,因为user_id是在

article表中设置,所以会出现user_id=null,所以会报错。

当在Userinfo.hbm.xml设置 inverse="true",它就不会再去更新级联关系,就可以直接进入数据库层面操作数据,所以上面删除用户时同时也把有级联关系的文章删掉了。

 

所以解决级联的“增删查改”问题,应该在“一对多”关系中的“一方”设置inverse=true;

 如:

 

Java代码   收藏代码
  1. <bag name="articles" table="article" order-by="id asc" lazy="false" cascade="all-delete-orphan" inverse="true">  
  2.         <key column="userid"></key>  
  3.         <one-to-many class="test.pojo.Article"></one-to-many>  
  4.      </bag>      
 

这样就行了。

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值