javaEE Hibernate, 一对多关系的配置/维护

例如:Customer(客户)对应多个联系人(LinkMan)

 

Test.java(多表的增删改的操作):

package cn.xxx.demo;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.xxx.domain.Customer;
import cn.xxx.domain.LinkMan;
import cn.xxx.utils.HibernateUtils;

//一对多|多对一关系操作
public class Test {
	@Test
	//添加客户以及客户下的联系人 (一个客户对应多个联系人)
	public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------------
		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); //如果Customer.hbm.xml放弃配置关系的维护;那么此句可以不写。
		//c.getLinkMens().add(lm2);
		
		//表达多对一,联系人属于哪个客户
		lm1.setCustomer(c);
		lm2.setCustomer(c);
		
		session.save(c);
		//session.save(lm1); // Customer.hbm.xml配置文件中配置cascade为save-update;保存/更新customer对象时,会自动保存/更新关联的linkman对象。
		//session.save(lm2);
		
		//-------------------------------------------------
		tx.commit();
		session.close();
	}
	
	@Test
	//为指定客户增加联系人 (一个客户对应多个联系人)
	public void fun2(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------------
		// 获得指定客户对象
		Customer c = session.get(Customer.class,1l); // 1l表示Long型id。 c对象本身是持久化状态,不需要save(c)。
		// 创建联系人
		LinkMan lm1 = new LinkMan();  // new出来的对象是瞬时状态,需要save(lm1)变成持久化状态。
		lm1.setLkm_name("张三");
		// 将联系人添加到指定客户,将客户设置到联系人中
		c.getLinkMens().add(lm1);
		lm1.setCustomer(c);
		// 执行保存(瞬时状态变成持久化状态)
		session.save(lm1); // lm1对象是new出来的(瞬时状态),通过save变成持久化状态。 customer本身就是持久化状态不需要save。 提交事务自动保存到数据库。
		//-------------------------------------------------
		tx.commit();
		session.close();
	}
	
	@Test
	//为客户删除联系人 (一个客户对应多个联系人)
	public void fun3(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------------
		// 获得指定客户对象
		Customer c = session.get(Customer.class,1l);
		// 获得要移除的联系人
		LinkMan lm = session.get(LinkMan.class, 3l);
		// 将联系人从客户集合中移除
		c.getLinkMens().remove(lm);
		lm.setCustomer(null);
		//-------------------------------------------------
		tx.commit();
		session.close();
	}
		
}

Test.java(级联操作cascade;自动save转为持久化状态):

package cn.xxx.demo;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.xxx.domain.Customer;
import cn.xxx.domain.LinkMan;
import cn.xxx.utils.HibernateUtils;

//测试级联操作
public class Test {
	@Test
	//保存客户以及客户 下的联系人 (Customer.hbm.xml文件中配置)
	//cascade:save-update 保存/更新客户,自动保存/更新与该客户关联的联系人
	public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------------
		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);
		
		//-------------------------------------------------
		tx.commit();
		session.close();
	}
	
	@Test
	//测试删除客户时,级联删除客户下的联系人 (Customer.hbm.xml文件中配置)
	//cascade:delete  删除客户,自动删除与该客户关联的联系人
	public void fun2(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------------
		Customer c = session.get(Customer.class,1l);

		session.delete(c); // 删除客户,自动删除与该客户关联的联系人
		//-------------------------------------------------
		tx.commit();
		session.close();
	}
	
	@Test
	//保存联系人,自动保存与联系人对应的客户 (LinkMan.hbm.xml文件中配置)
	//cascade:save-update
	public void fun3(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------------
		Customer c = new Customer();
		c.setCust_name("xxx");
		
		LinkMan lm1 = new LinkMan();
		lm1.setLkm_name("张三");
		// 为客户指定联系人
		c.getLinkMens().add(lm1);
		// 为联系人绑定客户
		lm1.setCustomer(c);
		
		//LinkMan.hbm.xml配置文件中配置cascade级联操作为save-update。
		session.save(lm1);  // 保存LinkMan对象,自动保存Customer对象。
		//-------------------------------------------------
		tx.commit();
		session.close();
	}
		
}

Customer.hbm.xml(配置文件;一对多中的一,放弃关系的维护(inverse="true")):

<?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="cn.xxx.domain" >  <!-- 配置package之后,下面可以使用简单类名 -->
	<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>
	
		<!-- 一对多关系,在配置文件中配置 -->
		<!-- (LinkMan和Customer类的映射配置文件中都要相应配置)
			name属性: 对象属性名(一的一方一般是集合类型)
			column属性: 对应其他数据库表中的外键列名
			class属性: 关联的对象完整类名
		 -->
		<!-- 
			级联操作: cascade  (简化操作.目的就是为了少写两行代码.不建议配置该项)
				save-update(推荐): 级联保存更新。 保存/更新customer对象时,会自动保存/更新关联的linkman对象。
				delete(不推荐,可能误删):级联删除。  删除customer对象时,会自动删除与之关联的linkman对象。
				all:save-update + delete
		 -->
		<!-- inverse属性: 是否禁止维护一对多的关系. 
				true: customer不维护关系
				false(默认值): customer维护关系 (更新customer数据库表时,会自动更新linkman表,来维护一对多的关系;执行两次sql语句操作)
				
			inverse属性: 性能优化.目的是为了提高关系维护的性能. (维护一对多的关系,需要额外执行sql语句)
			原则: 无论怎么放弃,总有一方必须要维护关系.
			一对多关系中: 一的一方放弃维护.也只能一的一方放弃.多的一方无法放弃维护.
		-->
		<set name="linkMens" inverse="true" cascade="save-update"  >
			<key column="lkm_cust_id" ></key>  <!-- 对应于LinkMan表中的外键 -->
			<one-to-many class="LinkMan" />
		</set>
	
	</class>
</hibernate-mapping>

LinkMan.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="cn.xxx.domain" >  <!-- 配置package之后,下面可以使用简单类名 -->
	<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>
		
		<!-- 
			级联操作: cascade  (简化操作.目的就是为了少写两行代码.不建议配置该项)
				save-update(推荐): 级联保存更新。 保存/更新linkman对象时,会自动保存/更新关联的customer对象。
				delete(不推荐,可能误删):级联删除。  删除linkman对象时,会自动删除与之关联的customer对象。
				all:save-update + delete
		 -->

		<!-- 
			多对一关系的配置 (LinkMan和Customer类的映射配置文件中都要相应配置)
			name属性:对象属性名
			column属性: 外键列名
			class属性: 关联的对象完整类名
		 -->
		<many-to-one name="customer" column="lkm_cust_id" class="Customer" cascade="save-update" >
		</many-to-one>
	</class>
</hibernate-mapping>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值