Hibernate框架第三天 (代码演示)Hibernate的关联关系映射之一对多映射

package test;

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

import domain.Customer;
import domain.Linkman;
import utils.HibernateUtils;

public class Demo {
	
	
	/*
	 * hibernate的级联一对多的级联保存与删除测试
	 * cascade为级联操作
	    * none                       不使用级联
	    * save-update                级联保存或更新
	    * delete                     级联删除
	    * delete-orphan              孤儿删除.(注意:只能应用在一对多关系)
	    * all                        除了delete-orphan的所有情况.(包含save-update delete)
	    * all-delete-orphan          包含了delete-orphan的所有情况.(包含save-update delete delete-orphan)
	 */
	
	
	
	
	
	/*
	 * 测试孤儿删除,从一方的集合中删除多方中的一个值(注意:只能应用在一对多关系)
	 * cascade: delete-orphan
	 */
	@Test
	public void demo4(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		
		Customer c = session.get(Customer.class, 1L);
		Linkman l1 = session.get(Linkman.class, 1L);
		
		//从集合中删除linkman对象,如不设置孤儿删除,只会修改多方的外键并未删除
		c.getLinkmans().remove(l1);
		//持久层对象自动保存
		
		tr.commit();
	}
	
	
	
	
	
	/*
	 * 关联删除比较简单与关联保存相同,只需要在cascade添加delete属性就可了,
	 * cascade中多个属性用逗号隔开。 
	 * 
	 */
	@Test
	public void demo3(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		
		Customer c = session.get(Customer.class, 1L);
		
		//因为设置了关联删除,在删除客户的时候,该客户的联系人也会被一起删除
		session.delete(c);
		
		
		tr.commit();
	}
	
	
	
	
	/*
	 * 配置将Customer 方向的 cascade为设置为save-update,这样仅存储 一方就可以了
	 *也可以反向设置或者双向都设置。
	 */
	@Test
	public void demo2(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		// 保存客户和联系人的数据
		Customer c1 = new Customer();
		c1.setCust_name("美美");
		
		// 创建2个联系人
		Linkman l1 = new Linkman();
		l1.setLkm_name("熊大");
		Linkman l2 = new Linkman();
		l2.setLkm_name("熊二");
		
		// 单向关联
		c1.getLinkmans().add(l1);
		c1.getLinkmans().add(l2);
		
		// 保存数据,在保存数据的方向设置 cascade为save-update 
		session.save(c1);
		//客户已经设置自动关联且外键已经添加了两个联系人,这两个联系人就不用手动保存了。
//		session.save(l1);
//		session.save(l2);
		
		tr.commit();
	}
	
	
	
	/*
	 * 测试手动双向链接,配置文件中不配置cascade属性,或为none
	 */
	@Test
	public void demo1() {
		
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		
		//创建用户与联系人
		Customer c = new Customer();
		c.setCust_name("alex");
		Linkman l1 = new Linkman();
		l1.setLkm_name("alex_linkman1");
		Linkman l2 = new Linkman();
		l2.setLkm_name("alex_linkman1");
		
		//设置双向链接
		c.getLinkmans().add(l1);
		c.getLinkmans().add(l2);
		
		l1.setCustomer(c);
		l2.setCustomer(c);
		
		//保存数据
		session.save(c);
		session.save(l1);
		session.save(l2);
		
		
		tr.commit();
		session.close();
		
		
	}
	
	
}

猜你喜欢

转载自blog.csdn.net/alexzt/article/details/81705451