`

Hiberante(七) ManyToMany_xml 单向和双向关联

 
阅读更多

ManyToMany(2种解决方案< 1.直接多对多,2.分解成连个oneToMany >) 

 

(1).第一种方式:

  实体类:

  Admin.java

 

public class Admin {
	private int id;
	private String name;
	private Set<Role> roles;
  省略get,set
}

   Role.java

 

public class Role {
	private int id;
	private String name;
	private Set<Admin> admins;
  省略get,set
}

  hbm文件

  Admin.hbm.xml

<hibernate-mapping package="org.zttc.itat.model">
	<class name="Admin" table="t_admin">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
		<set name="roles" table="t_admin_role" lazy="extra">
			<key column="aid" />
			<many-to-many class="Role" column="rid" />
		</set>
	</class>
</hibernate-mapping>

 Role.hbm.xml

 

<hibernate-mapping package="org.zttc.itat.model">
	<class name="Role" table="t_role">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
		<set name="admins" table="t_admin_role" lazy="extra">
			<key column="rid" />
			<many-to-many class="Admin" column="aid" />
		</set>
	</class>
</hibernate-mapping>

 

 测试方法:

/*
	 * 使用Many2Many不论在哪一方来维护关系都比较的麻烦,而且很多时候关联表中需要加入其他的属性
	 * 所以在开发中,经常使用两个一对多来替代多对多
	 */
	@Test
	public void testAdd01() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			Admin a1 = new Admin();
			a1.setName("张三");
			session.save(a1);
			Admin a2 = new Admin();
			a2.setName("李四");
			session.save(a2);
			Role r1= new Role();
			r1.setName("超级管理员");
			r1.add(a1);
			session.save(r1);
			Role r2 = new Role();
			r2.setName("财务管理人员");
			r2.add(a1);
			r2.add(a2);
			session.save(r2);
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			if(session!=null) session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void testLoad01() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			Admin a = (Admin)session.load(Admin.class, 1);
			System.out.println(a.getName());
			for(Role r:a.getRoles()) {
				System.out.println(r.getName());
			}
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			if(session!=null) session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}

 

(2).第二种方式

   实体类:

 

public class Teacher {
	private int id;
	private String name;
	private Set<TeacherCourse> tcs;
  省略get,set
}

 

public class Course {
	private int id;
	private String name;
	private Set<TeacherCourse> tcs;
 省略get,set
}

 

public class TeacherCourse {
	private int id;
	private double ach;
	private Teacher teacher;
	private Course course;
 省略get,set
}

 

  hbm文件

 

<hibernate-mapping package="org.th.model">
    <class name="Teacher" table="t_teacher">
        <id name="id">
          	<generator class="native"/>
        </id>
        <property name="name"/>
        <set name="tcs" lazy="extra" inverse="true">
        	<key column="tid"/>
        	<one-to-many class="TeacherCourse"/>
        </set>
    </class>
</hibernate-mapping>

 

<hibernate-mapping package="org.th.model">
    <class name="Course" table="t_course">
        <id name="id">
          	<generator class="native"/>
        </id>
        <property name="name"/>
        <set name="tcs" lazy="extra" inverse="true">
        	<key column="cid"/>
        	<one-to-many class="TeacherCourse"/>
        </set>
    </class>
</hibernate-mapping>

    

<hibernate-mapping package="org.th.model">
    <class name="TeacherCourse" table="t_teacher_course">
        <id name="id">
          	<generator class="native"/>
        </id>
        <property name="ach"/>
        <many-to-one name="teacher" column="tid"/>
        <many-to-one name="course" column="cid"/>
    </class>
</hibernate-mapping>

 

   测试方法:

 

@Test
	public void testAdd01() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			Teacher t1 = new Teacher();
			t1.setName("老张");
			session.save(t1);
			Teacher t2 = new Teacher();
			t2.setName("老刘");
			session.save(t2);
			Course c1 = new Course();
			c1.setName("数据结构");
			session.save(c1);
			Course c2 = new Course();
			c2.setName("计算机组成原理");
			session.save(c2);
			TeacherCourse tc1 = new TeacherCourse();
			tc1.setAch(87);
			tc1.setTeacher(t1);
			tc1.setCourse(c1);
			session.save(tc1);
			
			tc1 = new TeacherCourse();
			tc1.setAch(66);
			tc1.setTeacher(t1);
			tc1.setCourse(c2);
			session.save(tc1);
			
			tc1 = new TeacherCourse();
			tc1.setAch(190);
			tc1.setTeacher(t2);
			tc1.setCourse(c1);
			session.save(tc1);
			
			tc1 = new TeacherCourse();
			tc1.setAch(20);
			tc1.setTeacher(t2);
			tc1.setCourse(c2);
			session.save(tc1);
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			if(session!=null) session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void testLoad01() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			Teacher t = (Teacher)session.load(Teacher.class, 1);
			//load的时候由于延迟加载,会根据不同的情况取相应的关联对象,所以会发出大量的sql
			/**
			 * 总体来说:最佳实践就是,一般不使用双向关联,特别不建议使用一的这一方的关联
			 * 因为从一的这一端取关联对象很有可能会涉及到分页操作,所以基本不会使用
			 * 在设计的时候不是特殊情况不要使用双向关联。
			 */
			System.out.println(t.getName());
			for(TeacherCourse tc:t.getTcs()) {
				System.out.println(tc.getCourse().getName()+":"+tc.getAch());
			}
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			if(session!=null) session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}

 

 

 

 

分享到:
评论

相关推荐

    hiberante annotations reference_cn

    - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`: 描述实体间的一对多、多对一、一对一和多对多关系。 - `@JoinColumn`: 在关联关系中定义外键列。 - `@Temporal`: 用于日期和时间类型的字段,指定其...

    Hibernate双向一对一关联映射(XML版)

    在这个“Hibernate双向一对一关联映射(XML版)”的主题中,我们将深入探讨如何通过XML配置文件实现两个实体之间的一对一关系。 首先,我们需要理解一对一关联的概念。在数据库中,一对一关联意味着两个表中的每一...

    struts2_hiberante_spring

    具体到这个"SSH整合架包jar",它可能包含了这三个框架的库文件,以及一些整合所需的配置文件,比如struts.xml、hibernate.cfg.xml和spring-context.xml。开发者在项目中引入这个jar包,就可以快速搭建一个支持SSH...

    hiberante3 注解帮助文档

    hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档

    hiberante 源码 配置资料

    本文将结合"hibernate源码"和"hibernate配置"两个核心主题,深入探讨Hibernate的工作原理及配置细节,帮助读者从源码层面提升对Hibernate的理解。 一、Hibernate源码解析 1. 框架结构:Hibernate由多个模块组成,...

    Struts2 Spring2.5 Hiberante3.3.2 +ExtJS(Struts2-json)做的CRUD

    在这个DEMO中,Spring2.5.6采用了Annotation注解的方式,使得代码更加简洁,无需XML配置文件,只需在类或方法上添加注解,就可以声明bean和其依赖。Spring还提供了事务管理、AOP(面向切面编程)等功能,增强了应用...

    Hiberante3相关文档

    描述中的“Hiberante3_HQL”提示我们将会涉及到Hibernate查询语言(HQL),它是面向对象的查询语言,允许开发者以类和对象的方式查询数据库。 “Hibernate3_缓存机制”意味着这部分内容将深入探讨Hibernate如何通过...

    hibernate使用主键关联的一对一关系

    作者可能会讨论如何处理关联的懒加载和即时加载,以及可能遇到的问题和解决方案。 ### 实际应用 在实际开发中,一对一关系常用于那些逻辑上紧密耦合但又需要独立存储的数据模型,如用户个人信息和用户账户信息,...

    最新springboot2hiberante5项目

    最新springboot2基础hiberante5完整项目,打包jar,运行jsp,包括后台与前台,拦截器,登录,后台下载就可以使用,注意不是jpa,里面有完整Dao,千万级数据项目分离的代码,为了适合老项目开发特意集成hiberante5....

    spring+mvc+hiberante

    在 XML 配置文件中,我们可以声明 Spring MVC 的 DispatcherServlet,它是整个 Web 应用的入口点,负责接收请求并分发到相应的处理器。同时,我们还需要配置 ViewResolver,它解析视图,例如 JSP 页面。 接下来,...

    Hiberante3.jar + API

    本篇将深入探讨Hibernate3.jar及其API,帮助开发者更好地理解和运用这个库。 一、Hibernate3.jar介绍 Hibernate3.jar是Hibernate ORM框架的第三个主要版本,它提供了丰富的功能,包括对象持久化、查询语言(HQL)...

    DAO层中对Hiberante

    DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问,通常与ORM框架如Hibernate一起使用,以隔离业务逻辑和数据存储之间的交互。 在给定的代码片段中,`HibernateDAO` 类是用来封装...

    hiberante5.0.7安装jar包

    **七、Criteria API** 除了HQL,Hibernate还提供Criteria API进行动态查询,它是一种更面向对象的查询方式,可以在运行时构建查询。这对于构建复杂的、参数化的查询非常有用。 **八、事务管理** Hibernate支持...

    hiberante 参考手册 最新版 中文版 3.6.8

    - **单向Set-based的关联**: 通过集合类型来表达实体间的单向关联关系。 - **使关联工作**: 解释如何配置关联,以及如何处理级联操作,如删除时的级联删除。 - **值类型的集合**: 集合不仅可以包含实体对象,还可以...

    Hiberante 有关jar包

    Hibernate Tools是一套全新而且完整的面向Hibernate3的工具集合,它包含了Eclipse插件和Ant编译流程。Hibernate Tools是JBoss Tools的核心组件,所以他也是JBoss Developer Studio的一部分

    hiberante4.2.3-part01

    4. **级联操作**:通过`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解,我们可以定义实体之间的关联,并使用`cascade`属性来控制关联的级联操作,如保存、删除等。 5. **缓存机制**:Hibernate支持一级缓存...

    springmvc hiberante

    Spring MVC 和 Hibernate 是两个在Java Web开发中广泛使用的框架,它们分别是用于构建MVC(Model-View-Controller)架构的Web应用和管理数据库操作的对象关系映射(ORM)工具。在实际项目中,这两个框架的集成能提供...

    hiberante中文帮助文档

    9. **关联映射**: Hibernate支持一对一、一对多、多对一和多对多等各种关联映射,如`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`,使得对象之间的关系能自然地体现在数据库设计中。 10. **懒加载和...

    Struts2+Hiberante+ajax+Mysql 三级联动

    在这个项目中,它可能包含了预先创建的表结构,用于存储分类信息,比如一级分类、二级分类和三级分类的关联数据。 项目提供的JAR包可能包含了Struts2、Hibernate以及其他依赖库的jar文件,这些是运行项目所必需的。...

    Struts+Hiberante+Sprint 框架整合

    开发工具:MyEclipse 6....Struts+Spring+Hiberante框架整合的简单登录系统 无需配置任何文件、只需在mysql中创建一个空数据库 如:create database test; 注:mysql数据库用户名:root 密码:root

Global site tag (gtag.js) - Google Analytics