`

Hiberante(五) OneToMany_xml 双向关联

 
阅读更多

实体类

   Student.java

 

public class Student {
    
	private int id;
	private String name;
	private String no;
	private ClassRoom classroom;
  省略get,set
}

 ClassRoom.java

 

public class ClassRoom {
    private int id;
    private String name;
    private int grade;
    private Set<Student> stus;//在oneToMany时,在多的一方建立外键,而一的一方表现形式是set<>那个对象的 集合
 省略get,set
}

 hbm文件

 Student.hbm.xml

 

<hibernate-mapping package="org.th.model">
    <class name="Student" table="t_student" >
        <id name="id">
           <generator class="native"></generator>
        </id>
        <property name="name"></property>
        <property name="no"></property>
        
        <!--many-to-one 用来映射多对一, 那么表示对象中属性名称, column用来表示外键的名称 -->
        <!-- 当设置了cascade的时候,会自动完成关联。如果添加时没有关联对象 ,会自动创建一个关联对象
        最佳实践:如果没有特殊情况不要使用cascade,特别注意:可能使用cascade的地方一般是一的一方进行删除时使用
         特殊需求才会使用cascade的add,正常情况的add都是程序员自己完成添加
        -->
        <many-to-one name="classroom" column="cid" cascade="all" ></many-to-one>
    </class>
</hibernate-mapping>

ClassRoom.hbm.xml

<hibernate-mapping package="org.th.model">
	<class name="ClassRoom" table="t_classroom">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		<property name="grade"></property>
		<!-- inverse=true表示不再自己这一端维护关系 -->
		<set name="stus" lazy="extra" inverse="true">
			<key column="cid" />
			<one-to-many class="Student" />
		</set>
	</class>
</hibernate-mapping>

 

测试类:

/**
	 * 
	 * @Title: testAdd01
	 * @Description: 先添加1的,在添加多的
	 * @param
	 * @return void 返回类型
	 * @throws
	 */
	@Test
	public void testAdd01() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			// 先添加ClassRoom
			ClassRoom c = new ClassRoom();
			c.setName("java高级班");
			c.setGrade(10);
			session.save(c);

			Student s = new Student();
			s.setName("猪八戒");
			s.setNo("001");
			s.setClassroom(c);
			session.save(s);

			Student s2 = new Student();
			s2.setName("孙悟空");
			s2.setNo("002");
			s2.setClassroom(c);
			session.save(s2);

			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			if (session != null)
				session.getTransaction().rollback();
		} finally {
			if (session != null)
				HibernateUtil.close(session);
		}
	}

	/**
	 * 
	 * @Title: testAdd02
	 * @Description:先添加多的,在添加1的
	 * @param
	 * @return void 返回类型
	 * @throws
	 */
	@Test
	public void testAdd02() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();

			Student s = new Student();
			s.setName("煞神");
			s.setNo("003");
			session.save(s);

			Student s2 = new Student();
			s2.setName("唐僧");
			s2.setNo("004");
			session.save(s2);

			ClassRoom c = new ClassRoom();
			c.setName("java高级班");
			c.setGrade(10);
			session.save(c);
			// 上面会发出三条新增sql

			// 此时还会两条update
			s.setClassroom(c);
			s2.setClassroom(c);

			// 最佳实践:一定要先添加一的一方,之后再添加多的一方
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			if (session != null)
				session.getTransaction().rollback();
		} finally {
			if (session != null)
				HibernateUtil.close(session);
		}
	}

	/**
	 * 
	 * @Title: testAdd02
	 * @Description: student的关联对象classroom也是延迟加载
	 * @param
	 * @return void 返回类型
	 * @throws
	 */
	@Test
	public void testLoad01() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			Student s = (Student) session.load(Student.class, 1);
			System.out.println(s.getName());
			// 此时student的关联对象classroom也是延迟加载的,会再发出一条sql来取
			System.out.println(s.getClassroom().getName());
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			if (session != null)
				session.getTransaction().rollback();
		} finally {
			if (session != null)
				HibernateUtil.close(session);
		}
	}

	@Test
	public void testAdd03() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			// 先添加ClassRoom
			ClassRoom c = new ClassRoom();
			c.setName("java高级班");
			c.setGrade(10);
			// 此时数据库中没有ClassRoom没有存储,所以在添加student的时候会抛出异常 但.xml文件中设置了
			// cascade="all" 会自动创建关联对象

			Student s = new Student();
			s.setName("猪八戒");
			s.setNo("001");
			s.setClassroom(c);
			session.save(s);
			Student s2 = new Student();
			s2.setName("孙悟空");
			s2.setNo("002");
			s2.setClassroom(c);
			session.save(s2);

			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			if (session != null)
				session.getTransaction().rollback();
		} finally {
			if (session != null)
				HibernateUtil.close(session);
		}
	}

	/**
	 * 
	 * @Title: testDelete01
	 * @Description: 当多的一方使用cascade时,删除某一个多的,就会报错
	 * @param
	 * @return void 返回类型
	 * @throws
	 */
	@Test
	public void testDelete01() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			Student student = (Student) session.load(Student.class, 1);
			session.delete(student);// 这时候,cascade会制动关联classroom对象进行删除,而classroom在Student中有其他关联的话,就会报错

			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			if (session != null)
				session.getTransaction().rollback();
		} finally {
			if (session != null)
				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...

    hiberante - one to many - update

    2. **懒加载和立即加载**:默认情况下,`@OneToMany`关系可能是懒加载的,意味着关联的数据不会在加载主实体时立即加载,除非显式调用。如果希望在加载主实体时就获取关联数据,可以设置`fetch = FetchType.EAGER`。...

    hiberante3 注解帮助文档

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

    Hiberante中的五大核心接口.txt

    ### Hibernate中的五大核心接口 #### 一、概述 在Hibernate框架中,存在五大核心接口,它们分别是:`Session`、`SessionFactory`、`Transaction`、`Query` 和 `Configuration`。这些接口对于Hibernate的正常运行至...

    hiberante 源码 配置资料

    1. hibernate.cfg.xml:这是Hibernate的主要配置文件,包含了数据库连接信息、缓存设置、实体类映射等。例如,`&lt;session-factory&gt;`标签内的`&lt;property&gt;`元素用于设置属性,如`hibernate.connection.url`指定数据库...

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

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

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

    在Java的持久化框架Hibernate中,一对一(OneToOne)关系是一种常见的对象关系映射(ORM)配置,用于表示两个实体类之间的一种唯一关联。在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来...

    最新springboot2hiberante5项目

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

    Hiberante3相关文档

    立即加载(Eager Loading)则是在查询时同时加载关联的对象。批量加载(Bulk Loading)如批处理更新和删除,可以减少数据库交互次数,提高效率。此外,还有集合的分页加载和按需加载等策略。 总结起来,这个压缩包...

    Hiberante3.jar + API

    五、Hibernate的优势 1. 隐藏了数据库访问细节,提高了开发效率。 2. 提供了面向对象的查询语言HQL,使得查询更直观。 3. 支持级联操作,简化了对象关系的维护。 4. 内置缓存机制,提高性能。 5. 支持多种数据库,...

    DAO层中对Hiberante

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许开发者将数据库操作转化为对Java对象的操作。DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问...

    spring+mvc+hiberante

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

    hiberante5.0.7安装jar包

    **五、会话工厂与会话** Hibernate使用`SessionFactory`来创建`Session`对象,`Session`是与数据库交互的入口。会话负责执行CRUD操作,如保存、更新、删除和查询实体。 **六、查询语言HQL** Hibernate Query ...

    Hiberante 有关jar包

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

    hiberante annotations reference.pdf

    根据提供的文件信息,“hiberante annotations reference.pdf”主要介绍了Hibernate框架中的注解使用方法与参考。下面将基于标题、描述及部分文档内容进行详细的解析。 ### Hibernate注解概述 Hibernate是一个开源...

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

    - **双向关联**: 讨论如何处理双向关联,避免“多对多”循环引用问题。 - **使双向连起来**: 配置双向关联时的注意事项,特别是关于谁是“拥有者”的概念。 **1.3 第三部分——EventManager Web应用程序** - **...

    hiberante5基础讲义

    同时,通过@ManyToOne、@OneToMany等关系注解来处理对象间的关联。映射文件(.hbm.xml)是另一种映射方式,虽然在注解方式流行后使用较少,但依然有价值,因为它提供了更细粒度的控制。 三、会话工厂与会话 会话...

Global site tag (gtag.js) - Google Analytics