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学习之hibernate16——表与表的三种关系
我们来简单实现一下。
set说明
例如:
说明:
name属性:集合属性名
:外键
column属性: 外键列名
one-to-many:一对多
class属性: 与我关联的对象完整类名
many-to-one说明
例如:
说明:
name属性:引用属性名
column属性: 外键列名
class属性: 与我关联的对象完整类名
==注意:中的的column必须与 many-to-one 中的column一致==
![](http://img.blog.csdn.net/20170919000452676?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl3ZW5taW5nc2hpd28=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
联系人表
![](http://img.blog.csdn.net/20170919000505741?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl3ZW5taW5nc2hpd28=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20170919000519682?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl3ZW5taW5nc2hpd28=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
一说明
二实体类
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-oneset说明
例如:
<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 结果
联系人表相关文章推荐
- SSH与SSM学习之hibernate18——多对一一对多级联操作
- SSH与SSM学习之SSH整合08——Spring整合Hibernate环境操作数据库
- SSH与SSM学习之hibernate20——多对多操作
- SSH与SSM学习之hibernate19——多对一一对多关系维护
- SSH与SSM学习之hibernate25——批量抓取
- SSH与SSM学习之hibernate06——Session
- SSH与SSM学习之hibernate08——hibernate中的实体规则
- SSH与SSM学习之hibernate01——介绍与环境搭建
- SSH与SSM学习之hibernate09——对象的三种状态
- SSH与SSM学习之hibernate12——hibernate中的事务
- ssh学习:hibernate中 集合属性的操作
- 学习Hibernate——简单的增、删、改、查操作
- SSH与SSM学习之hibernate10——Hibernate的一级缓存
- SSH与SSM学习之hibernate15——SQL原生查询
- 【SSM学习笔记】Mybatis进行简单的CRUD操作
- SSH与SSM学习之hibernate23——关联级别加载策略之集合关联加载策略
- SSH与SSM学习之hibernate04——Configuration
- SSH与SSM学习之hibernate07——Transaction
- ssh学习:hibernate中 Session缓存及基本操作
- SSH与SSM学习之hibernate03——主配置详解