🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 例子 ~~~ Customer customer = new Customer(); customer.setCust_name("jack"); Linkman linkman = new Linkman(); linkman.setLkm_name("秘书"); customer.getLinkmans().add(linkman); linkman.setCustomer(customer); session.save(customer); session.save(linkman); ~~~ 产生的SQL ``` Hibernate: insert into cst_customer (cust_name, cust_source, cust_industry, cust_level, cust_address, cust_phone) values (?, ?, ?, ?, ?, ?) Hibernate: insert into cst_linkman (lkm_name, lkm_gender, lkm_phone, lkm_mobile, lkm_email, lkm_position, lkm_memo, cust_id) values (?, ?, ?, ?, ?, ?, ?, ?) Hibernate: update cst_linkman set cust_id=? where lkm_id=? ``` ## 原因 当一方的表存储到数据库的时候会放在存储区和快照区各一份,这时一方还不知道外键是多少.当多方的表存储的时候此时已经有外键了. 当外键生成的时候存储区的一方对象进行了更新,有了更新了外键字段.存储区和快照区进行对比.发现字段更新了.所以又生成了一条update语句. ## 解决方式 产生的原因是因为一级缓存.因为现在两方都知道外键的存在,那么两方都会维护 外键.让 其中一方放弃外键的维护即可解决 . 让一的一方放弃对外键的维护. ~~~ <!--配置一对多--> <set name="linkmans" inverse="true"> //这里设为true就可以让一的一方放弃对外键的维护 <!--外键字段名--> <key column="cust_id"></key> <!--多的一方全限定名--> <one-to-many class="com.like.bean.Linkman"></one-to-many> </set> ~~~