您的位置:首页 > 其它

SSH与SSM学习之hibernate17——多对一一对多简单操作

2017-09-19 00:06 405 查看
SSH与SSM学习之hibernate17多对一一对多简单操作
一说明

二实体类
1 Customer 客户实体

2 LinkMan 联系人实体

三映射
1 映射说明

2 Customerhbmxml

3 LinkManhbmxml

4 hibernatecfgxml

四测试demo
1 保存客户 以及客户 下的联系人
11 实例代码

12 结果

2 为客户添加联系人
21 实例代码

22 结果

3 为客户删除联系人
31 实例代码

32 结果

SSH与SSM学习之hibernate17——多对一一对多简单操作

一、说明

现在有两个表,一个是客户表,一个是联系人表。它们之间存在一对多的关系。

SSH与SSM学习之hibernate16——表与表的三种关系

我们来简单实现一下。

二、实体类

2.1 Customer 客户实体

package com.qwm.hibernate03.domain;

import java.util.HashSet;
import java.util.Set;

/**
* @author:qiwenming
* @date:2017/9/18 0018   21:25
* @description:
*
*/
public class Customer {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
//使用set集合,表达一对多的关系
private Set<LinkMan> linkMens = new HashSet<>();
....省略了get/set方法...
}


2.2 LinkMan 联系人实体

package com.qwm.hibernate03.domain;

/**
* @author:qiwenming
* @date:2017/9/18 0018   21:26
* @description:
* 联系人
*/
public class LinkMan {
private Long lkm_id;
private Character lkm_gender;
private String lkm_name;
private String lkm_phone;
private String lkm_email;
private String lkm_qq;
private String lkm_mobile;
private String lkm_memo;
private String lkm_position;
//表达多对一
private Customer customer;
....省略了get/set方法...
}


三、映射

3.1 映射说明

我们需要使用到一对多和多对一映射。这里我们用到的一对多映射是set,多对一映射是many-to-one

set说明

例如:

<set name="linkMens">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"></one-to-many>
</set>


说明:

name属性:集合属性名

:外键

column属性: 外键列名

one-to-many:一对多

class属性: 与我关联的对象完整类名

many-to-one说明

例如:

<many-to-one name="customer" column="lkm_cust_id" class="Customer"/>


说明:

name属性:引用属性名

column属性: 外键列名

class属性: 与我关联的对象完整类名

==注意:中的的column必须与 many-to-one 中的column一致==

3.2 Customer.hbm.xml

<?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>

<!-- 集合,一对多关系,在配置文件中配置 -->
<!--
name属性:集合属性名
column属性: 外键列名
class属性: 与我关联的对象完整类名
-->
<set name="linkMens" inverse="true" cascade="delete">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"></one-to-many>
</set>
</class>
</hibernate-mapping>


3.3 LinkMan.hbm.xml

<!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="LinkMan" table="cst_linkman" >
<id name="lkm_id"  >
<generator class="native"></generator>
</id>
<property name="lkm_gender"  ></property>
<property name="lkm_name"  ></property>
<property name="lkm_phone"  ></property>
<property name="lkm_email"  ></property>
<property name="lkm_qq"  ></property>
<property name="lkm_mobile"  ></property>
<property name="lkm_memo"  ></property>
<property name="lkm_position"  ></property>

<!-- 多对一 -->
<!--
name属性:引用属性名
column属性: 外键列名
class属性: 与我关联的对象完整类名
-->
<many-to-one name="customer" column="lkm_cust_id" class="Customer"/>
</class>
</hibernate-mapping>


3.4 hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--数据库驱动-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--数据库url-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/htest</property>
<!--数据库连接用户名-->
<property name="hibernate.connection.username">root</property>
<!--数据库连接密码-->
<property name="hibernate.connection.password">xm123456</property>
<!--数据库方言-->
<!-- 数据库方言
不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
sql99标准: DDL 定义语言  库表的增删改查
DCL 控制语言  事务 权限
DML 操纵语言  增删改查
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- #hibernate.show_sql true
#hibernate.format_sql true
-->
<!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
<property name="hibernate.format_sql">true</property>
<!--
## auto schema export  自动导出表结构. 自动建表
#hibernate.hbm2ddl.auto create      自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
#hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
#hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
#hibernate.hbm2ddl.auto validate    校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
-->
<!--自动创建表-->
<property name="hibernate.hbm2ddl.auto">update</property>

<!--指定session与当前线程绑定-->
<property name="hibernate.current_session_context_class">thread</property>

<!--导入 User 配置-->
<!-- 引入orm元数据
路径书写: 填写src下的路径
-->
<mapping resource="com/qwm/hibernate03/domain/Customer.hbm.xml"></mapping>
<mapping resource="com/qwm/hibernate03/domain/LinkMan.hbm.xml"></mapping>

</session-factory>
</hibernate-configuration>


四、测试demo

4.1 保存客户 以及客户 下的联系人

4.1.1 实例代码

/**
* 保存客户 以及客户 下的联系人
*/
@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();
}


4.1.2 结果

客户表



联系人表



4.2 为客户添加联系人

4.2.1 实例代码

/**
* 为客户添加联系人
*/
@Test
public void test2(){
//1.获取session
Session session = HibernateUtils.openSession();
//2.开启事务
Transaction t = session.beginTransaction();

//3.操作
//3.1获取到客户
//3.2创建我们的联系人
//3.3把联系人添加到客户的中
//3.4把客户添加到联系人中
//3.5保存联系人
Customer c = session.get(Customer.class,1L);
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("小明");
c.getLinkMens().add(lm1);
lm1.setCustomer(c);
session.save(lm1);
//4.提交事务
t.commit();
//5.关闭资源
session.close();
}


4.2.2 结果

联系人表



4.3 为客户删除联系人

4.3.1 实例代码

/**
* 为客户删除联系人
*/
@Test
public void test3(){
//1.获取session
Session session = HibernateUtils.openSession();
//2.开启事务
Transaction t = session.beginTransaction();

//3.操作
//3.1获取到客户
//3.2获得要移除的联系人
//3.3将联系人从客户集合中移除
Customer c = session.get(Customer.class,1L);
LinkMan lm = session.get(LinkMan.class,3L);
c.getLinkMens().remove(lm);
lm.setCustomer(null);
//4.提交事务
t.commit();
//5.关闭资源
session.close();
}


4.3.2 结果

联系人表

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: