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

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

    博客分类:
  • J2EE
 
阅读更多

       近日拿起好久没碰的JAVA重新看了看,发现变化还真是大。在看Hiberhate时,发现他的ManyToMany用起来不是很方便,到网上一搜发现很多人都并没有完全了解这个关联关系的用法,为了造福人类,干脆我来个用例大全算了。

 

       在使用Hiberhate的关联映射时,不管你是双向还是单向,都是有主控方的,主控方的操作会自动的影响关联关系(中间表),对于双向多对多来说,主控方的操作则会自动的影响中间表,如果需要影响到被控方表内的数据,则需要进行CascadeType配置。

 

       但是当你在被控方操作数据时,被控方并不能影响到关联关系(中间表),如果要修改关联关系则需要配置CascadeType属性,同时配置了该属性也会影响到主控方表内的数据。

 

例子:

       假设我们要设计一个角色与组织机构对应的维护功能,对应表结构如下:

             组织机构表:org                                  角色表:role                                           中间表:org_role

             id,name,description                     id,name,parentId,description           orgId,roleId

 

       通常在此类功能中,角色和机构都是单独添加,但是在添加和维护的过程中需要同步二者的关联关系。

 

       实体类及annotation配置,注意红色字体,代码中CascadeType.PERSIST是为了演示而特地加入,实际应用中基本不用设置该选项,只需设置CascadeType.MERGE便可

org:

package org.taomujian.model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="org")
public class Org {
	private String id ;
	private String name;
	private String description;

 	private List<Role> roleList = new ArrayList<Role>();
	@Id
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}

//	@ManyToMany(mappedBy="orgList",cascade={CascadeType.ALL},fetch=FetchType.EAGER)
	@ManyToMany(mappedBy="orgList",fetch=FetchType.EAGER,cascade={CascadeType.MERGE})
	public List<Role> getRoleList() {
		return roleList;
	}
	public void setRoleList(List<Role> roleList) {
		this.roleList = roleList;
	}
	@Override
	public boolean equals(Object obj) {
		boolean flag = false;
		if(!(obj instanceof Org)){
			flag = false;
		}else {
			Org org = (Org)obj;
			if(org.getId().equals(this.getId())){
				flag = true;
			}
		}
		return flag;
	}
	@Override
	public int hashCode() {
		int result = id.hashCode(); 
		result = result+(int)'f';
		return result;
	}
	
	
	
}

 

role:

package org.taomujian.model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="role")
public class Role {
	private String id;
	private String name;	
	private String parentId;
	private String description;	
	
	private List<Org> orgList = new ArrayList<Org>();
	
	public Role(){
		
	}
	
	public Role(String id, String name, String parentId, String discription) {
		this.id = id;
		this.name = name;
		this.parentId = parentId;
		this.description = discription;
	}
	@Id
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getParentId() {
		return parentId;
	}

	public void setParentId(String parentId) {
		this.parentId = parentId;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}


	
//	@ManyToMany(cascade={CascadeType.ALL})
	@ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.MERGE,CascadeType.PERSIST})
	@JoinTable(
			name="org_role",
			joinColumns={@JoinColumn(name="roleId",referencedColumnName="id")},
			inverseJoinColumns={@JoinColumn(name="orgId",referencedColumnName="id")}
	)
	public List<Org> getOrgList() {
		return orgList;
	}

	public void setOrgList(List<Org> orgList) {
		this.orgList = orgList;
	}
	//重写该方法,以辨别是否是同一条数据	
	@Override
	public boolean equals(Object obj) {
		boolean flag = false;
		if(!(obj instanceof Org)){
			flag = false;
		}else {
			Org org = (Org)obj;
			if(org.getId().equals(this.getId())){
				flag = true;
			}
		}
		return flag;
	}
	@Override
	public int hashCode() {
		int result = id.hashCode(); 
		result = result+(int)'f';
		return result;
	}
}

 在hibernate.cfg.xml增加实体类的配置

        <mapping class="org.taomujian.model.Org"/>
        <mapping class="org.taomujian.model.Role"/>

 

分享到:
评论

相关推荐

    如何使用Hibernate 双向 单-多 多-单 多-多 Hibernate.rar

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

    hibernate-release-5.2.10

    在SSH(Spring、Struts、Hibernate)框架中,Hibernate作为持久层的解决方案,极大地简化了数据库操作的复杂性。SSH框架的组合使得企业级应用开发更加高效和便捷。 "hibernate-release-5.2.10" 是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

    **标题详解:** "hibernate-jpa-2.1-api 1.0.0.Final API" 这个标题指的是Hibernate对Java Persistence API (JPA) 2.1规范的实现,版本为1.0.0.Final。Hibernate是Java领域中最受欢迎的对象关系映射(ORM)框架之一...

    hibernate-annotations-3.4.0.GA

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

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

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

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

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

    Hibernate之第2解之-hibernate_demo_1_annotation

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

    Note for hibernate 2009.1.8 - 2009.1.13

    "Note for hibernate 2009.1.8 - 2009.1.13" 这个标题表明这是一份关于Hibernate ORM框架的笔记,时间跨度为2009年1月8日至1月13日。这可能是一个学习记录或工作日志,涵盖了在这段时间内对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)...

    hibernate5_ManyToMany多对多单向维护

    在Java编程领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。在处理多对多关联关系时,Hibernate提供了一种方便的方式来实现这种复杂的...

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

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

Global site tag (gtag.js) - Google Analytics