Hibernate 双向ManyToMany 究极解决 新增-删除-修改-查询(4)

Org增删改查:

同样看代码

package com.taomujian.dao;

import java.util.List;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
import org.taomujian.dao.OrgDAO;
import org.taomujian.dao.RoleDAO;
import org.taomujian.model.Org;
import org.taomujian.model.Role;


public class OrgDAOTest {
	/**
	 * 完整的插入org和role及其级联关系,需要配置CascadeType.PERSIST
	 * 
	 * 注:因为关联关系被设置为有role管理,所以如果需要添加关联关系同时
	 *    又不新增role表内的数据,则在此处需要使用role来维护关联关系
	 *    【修改同新增】
	 */
	@Test
	public void testSaveOrg1(){
		OrgDAO orgDAO = new OrgDAO();
		Org org = new Org();
		org.setId("dd2");
		org.setName("我是org自己主动新增的a!");
		
		Role role = new Role();
		role.setId("111");
		role.setName("我是被org添加的a!");

		if(role.getOrgList().size()==0||!role.getOrgList().contains(org)){
			role.getOrgList().add(org);
		}
		if(org.getRoleList().size()==0||org.getRoleList().contains(role)){
			org.getRoleList().add(role);
		}
		orgDAO.saveOrg(org);
	}
	
	/**
	 * 新增一条被控方的数据,同时更新被控方org与主控方role间的关联关系
	 */
	@Test
	public void testSaveOrg2(){
		RoleDAO  roleDAO = new RoleDAO();
		OrgDAO orgDAO = new OrgDAO();
		Role role = roleDAO.getRole("111");
		Org org = new Org();
		org.setId("dd3");

		org.getRoleList().add(role);    
        role.getOrgList().add(org);

        orgDAO.mergeOrg(org); 
	}
	
	/**
	 * 修改主空方role 与被控org的关联关系
	 * 只增加关联关系到中间表中,需要添加CascadeType.MERGE
	 * role表和org表中必须包含要关联的两条数据
	 */
	@Test
	public void testMergeOrg1(){
		RoleDAO  roleDAO = new RoleDAO();
		OrgDAO orgDAO = new OrgDAO();
		Role role = roleDAO.getRole("111");
		Org org = orgDAO.getOrg("dd2");

		org.getRoleList().add(role);    
        role.getOrgList().add(org);

        orgDAO.mergeOrg(org); 

	}
	
	/**
	 * 只更新org被控方表内的数据
	 */
	@Test
	public void testMergeOrg2(){
		OrgDAO orgDAO = new OrgDAO();
		Org org = new Org();
		org.setId("dd2");
		org.setName("我是org自己调用merge方法产生的a!");
		
		orgDAO.mergeOrg(org);
	}
	

	
	/**
	 * 只删除被控方org,无法删除,会产生脏数据,因为存在外键约束,无法删除
	 */
//	@Test
//	public void testDelOrg1(){
//		OrgDAO orgDAO = new OrgDAO();
//
//	    Org org = new Org();
//	    org.setId("dd1");
//	    org.setRoleList(null);
//	    
//		orgDAO.delOrg(org);
//	}
	
	/**
	 *  被控方删除(先删除中间表记录)  
	 */
	@Test
	public void testDelOrg2(){
		
		OrgDAO orgDAO = new OrgDAO();
	    Org org = orgDAO.getOrg("dd1");
	   
	    testRemoveOrg_Role();
	    orgDAO.delOrg(org);
	}
	
	/**
	 * 只删除关联关系,需要设置CascadeType.MERGE
	 */
	@Test
	public void testRemoveOrg_Role(){
		OrgDAO orgDAO = new OrgDAO();
	
		Org org = orgDAO.getOrg("dd1");
		List<Role> roleList = org.getRoleList();
		for (int i=0;i<roleList.size();i++) {
			Role role = roleList.get(i);
			org.getRoleList().remove(role); // 删除组织机构表对角色的引用
			role.getOrgList().remove(org);// 删除角色表对组织机构表的引用
		}
		orgDAO.mergeOrg(org);
	}
	
	@Test
	public void testSchemaExport() {
		new SchemaExport(new Configuration().configure()).create(false, true);
	}
}

 

 

注:我的编译环境是  jdk6+j2ee6+junit4+sql2005

你可能感兴趣的:(Hibernate)