SSH与SSM学习之hibernate19——多对一一对多关系维护
2017-09-19 01:27
411 查看
SSH与SSM学习之hibernate19多对一一对多关系维护
一SQL语句多余了
二inverse 配置关系是否维护
三配置客户表
四测试的方法可以出去不必要的代码
五删除
添加数据的时候,我们发现,我们直插入三条数据,但是却有5个sql语句。
前面的3个SQL是插入数据的,这个无可厚非。那么后面的两个SQL呢?它又是用来干嘛的呢?其实这个我看到是用来更新 联系人表 的外键的,这个外键在插入联系人的时候已经维护过了。所以不可能是联系人表搞得鬼,只可能是 客户表 搞得鬼了。
再次运行上面的代码,得到如下结果
所以上面的测试代码可以去除客户维护联系人的代码。
把联系人中的客户设置为空,然后可以删除客户表中对应的客户了(可以使用我们的级联)
让客户表维护与联系人之间的关系,这样删除的时候就把对应的联系的外设置为空了。
一SQL语句多余了
二inverse 配置关系是否维护
三配置客户表
四测试的方法可以出去不必要的代码
五删除
SSH与SSM学习之hibernate19——多对一一对多关系维护
一、SQL语句多余了?
使用我们之前的代码/** * 保存客户 以及客户 下的联系人 */ @Test public void test1(){ //1.获取session Session session = HibernateUtils.openSession(); //2.开启事务 Transaction t = session.beginTransaction(); //3.操作 Customer c = new Customer(); c.setCust_name("吊毛公司"); LinkMan lm1 = new LinkMan(); lm1.setLkm_name("李吊毛"); LinkMan lm2 = new LinkMan(); lm2.setLkm_name("高小飞"); //表达一对多,客户下有多个联系人 c.getLinkMens().add(lm1); c.getLinkMens().add(lm2); //表达多对一,联系人属于哪个客户 lm1.setCustomer(c); lm2.setCustomer(c); session.save(c); session.save(lm1); session.save(lm2); //4.提交事务 t.commit(); //5.关闭资源 session.close(); }
添加数据的时候,我们发现,我们直插入三条数据,但是却有5个sql语句。
Hibernate: insert into cst_customer (cust_name, cust_source, cust_industry, cust_level, cust_linkman, cust_phone, cust_mobile) values (?, ?, ?, ?, ?, ?, ?) Hibernate: insert into cst_linkman (lkm_gender, lkm_name, lkm_phone, lkm_email, lkm_qq, lkm_mobile, lkm_memo, lkm_position, lkm_cust_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: insert into cst_linkman (lkm_gender, lkm_name, lkm_phone, lkm_email, lkm_qq, lkm_mobile, lkm_memo, lkm_position, lkm_cust_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: update cst_linkman set lkm_cust_id=? where lkm_id=? Hibernate: update cst_linkman set lkm_cust_id=? where lkm_id=?
前面的3个SQL是插入数据的,这个无可厚非。那么后面的两个SQL呢?它又是用来干嘛的呢?其实这个我看到是用来更新 联系人表 的外键的,这个外键在插入联系人的时候已经维护过了。所以不可能是联系人表搞得鬼,只可能是 客户表 搞得鬼了。
二、inverse 配置关系是否维护
<!-- inverse属性: 配置关系是否维护. true: customer不维护关系 false(默认值): customer维护关系 inverse属性: 性能优化.提高关系维护的性能. 原则: 无论怎么放弃,总有一方必须要维护关系. 一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃. -->
三、配置客户表
在客户表中 我们配置不维护 关系<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.qwm.hibernate03.domain" >
<class name="Customer" table="cst_customer" >
<id name="cust_id" >
<generator class="native"></generator>
</id>
<property name="cust_name" column="cust_name" ></property>
<property name="cust_source" column="cust_source" ></property>
<property name="cust_industry" column="cust_industry" ></property>
<property name="cust_level" column="cust_level" ></property>
<property name="cust_linkman" column="cust_linkman" ></property>
<property name="cust_phone" column="cust_phone" ></property>
<property name="cust_mobile" column="cust_mobile" ></property>
<!-- inverse属性: 配置关系是否维护. true: customer不维护关系 false(默认值): customer维护关系 inverse属性: 性能优化.提高关系维护的性能. 原则: 无论怎么放弃,总有一方必须要维护关系. 一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃. -->
<set name="linkMens" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"></one-to-many>
</set>
</class>
</hibernate-mapping>
再次运行上面的代码,得到如下结果
Hibernate: insert into cst_customer (cust_name, cust_source, cust_industry, cust_level, cust_linkman, cust_phone, cust_mobile) values (?, ?, ?, ?, ?, ?, ?) Hibernate: insert into cst_linkman (lkm_gender, lkm_name, lkm_phone, lkm_email, lkm_qq, lkm_mobile, lkm_memo, lkm_position, lkm_cust_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: insert into cst_linkman (lkm_gender, lkm_name, lkm_phone, lkm_email, lkm_qq, lkm_mobile, lkm_memo, lkm_position, lkm_cust_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
四、测试的方法可以出去不必要的代码
如果客户放弃维护与联系人的关系. 维护关系的代码可以省略所以上面的测试代码可以去除客户维护联系人的代码。
/** * 保存客户 以及客户 下的联系人 */ @Test public void test1(){ //1.获取session Session session = HibernateUtils.openSession(); //2.开启事务 Transaction t = session.beginTransaction(); //3.操作 Customer c = new Customer(); c.setCust_name("吊毛公司"); LinkMan lm1 = new LinkMan(); lm1.setLkm_name("李吊毛"); LinkMan lm2 = new LinkMan(); lm2.setLkm_name("高小飞"); //表达一对多,客户下有多个联系人 //表达一对多,客户下有多个联系人. // 如果客户放弃维护与联系人的关系. 维护关系的代码可以省略 // c.getLinkMens().add(lm1); // c.getLinkMens().add(lm2); //表达多对一,联系人属于哪个客户 lm1.setCustomer(c); lm2.setCustomer(c); session.save(c); session.save(lm1); session.save(lm2); //4.提交事务 t.commit(); //5.关闭资源 session.close(); }
五、删除
删除的时候需要注意,由于我们的客户表和联系人表是关联的。所以我们有两种方式删除。把联系人中的客户设置为空,然后可以删除客户表中对应的客户了(可以使用我们的级联)
<set name="linkMens" inverse="true" cascade="delete" > <key column="lkm_cust_id" ></key> <one-to-many class="LinkMan" /> </set>
让客户表维护与联系人之间的关系,这样删除的时候就把对应的联系的外设置为空了。
<set name="linkMens" inverse="false" > <key column="lkm_cust_id" ></key> <one-to-many class="LinkMan" /> </set>
相关文章推荐
- SSH与SSM学习之hibernate18——多对一一对多级联操作
- SSH与SSM学习之hibernate17——多对一一对多简单操作
- SSH与SSM学习之hibernate16——表与表的三种关系
- SSH与SSM学习之hibernate04——Configuration
- SSH与SSM学习之hibernate10——Hibernate的一级缓存
- SSH与SSM学习之hibernate11——hibernate的二级缓存
- SSH与SSM学习之hibernate23——关联级别加载策略之集合关联加载策略
- SSH与SSM学习之hibernate02——ORM配置详解
- SSH与SSM学习之hibernate06——Session
- 【hibernate学习杂记】维护关系的一方和不维护关系的一方的区别与联系
- hibernate级联关系(SSH学习第2天)
- SSH与SSM学习之hibernate07——Transaction
- SSH与SSM学习之hibernate05——SessionFactory
- SSH与SSM学习之hibernate13——HQL查询
- SSH与SSM学习之hibernate14——Criteria查询
- ssh学习:hibernate关系映射(5)
- SSH与SSM学习之SSH整合05——单独配置Hibernate
- SSH与SSM学习之hibernate22——类级别加载策略
- ssh学习:hibernate关系映射(4)
- SSH与SSM学习之SSH整合06——Hibernate与Spring整合