`
taomujian
  • 浏览: 110884 次
  • 性别: Icon_minigender_1
  • 来自: 安徽-合肥
社区版块
存档分类
最新评论

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

    博客分类:
  • J2EE
 
阅读更多

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 双向 单-多 多-单 多-多 Hibernate.rar

    本教程将深入探讨如何使用Hibernate实现多表之间的双向关联,包括单-多、多-单、多-多关系。 **一、单-多关系** 在数据库设计中,单-多关系指的是一个实体可以与多个其他实体相关联。例如,一个学生可以属于多个...

    hibernate-release-5.2.10

    4. **查询语言**:HQL(Hibernate Query Language)是面向对象的查询语言,类似于SQL,但更贴近Java对象。此外,还有Criteria API和JPQL(Java Persistence Query Language)供选择。 5. **事务管理**:Hibernate...

    hibernate中manytomany的例子

    - Hibernate会自动维护中间表,但需要注意的是,如果直接操作数据库删除了一个实体,那么相关的关联可能不会自动更新。因此,推荐始终通过Hibernate API来管理关联关系,避免直接操作数据库。 5. 中间表的自定义:...

    HIbernate-ManytoMany:HIbernate-ManytoMany 不同实体之间的关系

    本文将深入探讨如何在Hibernate中实现多对多(ManyToMany)的关系映射,以及相关的重要概念和技术细节。 在数据库设计中,多对多关系是最常见的一种关联类型,例如,一个学生可以选修多门课程,一门课程也可以被多...

    HIBERNATE:Hibernate 学习一--注解方式自动建表

    在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是底层的数据存取。这篇博客"Hibernate学习一--注解方式自动建表"主要探讨了如何使用...

    Hibernate应用例子many-to-many

    为了查询多对多关系,可以使用HQL(Hibernate Query Language)或者Criteria API。例如,要获取一个学生的所有课程: ```java String hql = "from Student s where s.id = :studentId"; Query&lt;Student&gt; query = ...

    hibernate-orm-master.zip

    Session则代表了一个数据库连接,是执行数据库操作的接口,它可以用来保存、更新、删除对象,以及执行HQL(Hibernate查询语言)和SQL。 三、持久化对象与实体类 在Hibernate中,Java类被称为实体类,它们代表数据库...

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session...

    hibernate_reference_anotation 3.5.0-final pdf

    ### Hibernate Annotations 3.5.0-Final:深入解析与应用 #### 一、概述 在对象关系映射(ORM)领域中,Hibernate 是一款非常成熟的框架,它提供了丰富的功能来帮助开发者处理复杂的数据库交互问题。随着 Java ...

    hibernate-annotation

    《深入理解Hibernate注解》 Hibernate作为Java领域中的一...综上,Hibernate注解为Java开发人员提供了更便捷、更直观的ORM解决方案。通过熟练掌握并合理运用这些注解,开发者可以更好地驾驭数据库操作,提高开发效率。

    hibernate-distribution-3.6.6.Final-dist

    4. **Criteria查询**:除了传统的HQL(Hibernate Query Language)查询,3.6.6版本还提供了Criteria API,这是一种更加面向对象的查询方式,可以动态构建查询条件,增强了代码的可读性和灵活性。 5. **实体生命周期...

    hibernate-jpa-2.1-api 1.0.0.Final API

    4. **Criteria API**:提供构建动态查询的能力,比JPQL更灵活,可以避免SQL注入问题。 5. **事务(Transaction)**:JPA支持事务管理,确保数据操作的原子性、一致性、隔离性和持久性。 6. **关系映射**:包括一对...

    Hibernate最经典中文帮助文档-一看就会,容易上手

    - **Session**:是Hibernate中的工作单元,负责对象的持久化操作,如保存、更新、删除和查询。 - **SessionFactory**:用于创建Session对象,它是线程安全的,应用程序中通常只需要一个SessionFactory实例。 - **...

    (5)Hibernate中的many-to-many和并发

    在Java的持久化框架Hibernate中,Many-to-Many关系是一种常见的数据模型,它表示一个实体可以与多个其他实体之间存在关联,反之亦然。这篇博客文章可能会深入探讨如何在Hibernate中处理这种多对多的关系,并可能涉及...

    hibernate-annotations-3.4.0.GA

    《Hibernate Annotations 3.4.0.GA:深入理解与应用》 Hibernate是Java领域中广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。而Hibernate ...

    hibernate-entitymanager-3.4.0.GA

    【标题】"hibernate-entitymanager-3.4.0.GA" 是一个与Java持久化框架Hibernate Entity Manager相关的库,这个版本号表明它是2009年左右发布的一个稳定版本。Hibernate Entity Manager是JPA(Java Persistence API)...

    Hibernate之第2解之-hibernate_demo_1_annotation

    【标题】"Hibernate之第2解之-hibernate_demo_1_annotation"主要涵盖了使用Hibernate框架进行对象关系映射(ORM)的实践,特别是基于注解的方式。在这个教程中,我们将深入探讨如何利用Java注解来配置Hibernate实体...

    hibernate5_ManyToMany多对多单向维护

    4. 查询关联: 可以通过`User`实体获取所有关联的`Role`: ```java User user = userRepository.findById(userId).orElseThrow(); for (Role role : user.getRoles()) { System.out.println("Role Name: " + ...

    Note for hibernate 2009.1.8 - 2009.1.13

    4. **HQL和 Criteria 查询:** Hibernate支持面向对象的查询语言HQL,以及Criteria API,提供了更灵活的查询方式,不同于传统的SQL。 5. **缓存机制:** Hibernate提供了第一级缓存(Session级别的)和第二级缓存...

    hibernate 中文api +hibernate_-annotations_中文帮助文档

    Hibernate 是一个广泛使用的Java语言的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为面向对象的方式,简化了Java应用的数据库交互。Hibernate Annotations是Hibernate框架的一部分,提供了注解方式来...

Global site tag (gtag.js) - Google Analytics