您的位置:首页 > 运维架构

SSH与SSM学习之hibernate19——多对一一对多关系维护

2017-09-19 01:27 411 查看
SSH与SSM学习之hibernate19多对一一对多关系维护
一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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: