`

hibernate 关联映射(一) many to one

阅读更多

今天试着写了一个hibernate的关联映射,关系是一对多。

写了两个实体类,Group 和User。

Group.java文件:

package com.mp.hibernate;

public class Group {
	
	private int id;
	
	private String name;

	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

 User.java文件:

 

package com.mp.hibernate;

import java.util.Date;

public class User {
	
	private int id;
	
	private String name;

	private Group group;
	
	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public Group getGroup() {
		return group;
	}

	public void setGroup(Group group) {
		this.group = group;
	}	
}

 

 

在这两个对象关系中通过User持有Group对象来表明两者之间的多对一的关系,那么如何来配置使得hibernet能认识他们的关系呢?

 

那么来看一下Group.hbm.xml和User.hbm.xml这两个文件如何来写吧:

 

Group.hbm.xml文件:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.mp.hibernate.Group" table="t_group">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
	</class>
</hibernate-mapping>

 

User.hbm.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.mp.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		<many-to-one name="group" column="groupid"></many-to-one>
	</class>
</hibernate-mapping>

 

其中在这里的核心配置就是

<many-to-one name="group" column="groupid"></many-to-one>
这个配置,首先它配置在User中就是 属于many 方面,它的name属性指明了one是谁,

这两个配置文件中对对象的table都重新命名主要是防止出错,由于User里面的group与Group对象名字相同。

 

写了一个测试方法来测试现在能否完成对象的保存:

 

public void testSave1() {
		Session session = null;
		User user = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Group group = new Group();
			group.setName("明星");
			
			User u1 = new User();
			u1.setName("刘德华");
			u1.setGroup(group);
			
			User u2 = new User();
			u2.setName("陈小春");
			u2.setGroup(group);
			
			//仅保存user时不能成功保存,抛出TransientObjectException异常
			//因为Group为Transient状态,O id没有分配值
			//persistent状态对象是不能引用Transient状态的对象的
			session.save(u1);
			session.save(u2);
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
	}

 

用这个方法的的结果已经在代码中间的注释中说明了,这里就不再过多说明。

然后又在此基础上面添加了一句就是:

session.save(group);

这样就能看到效果了:



 

表中user 的id 是3 和 4 是由于第一次存储的时候出错了,已经自增过了。

 这样算是成功了,但是感觉还不是那么完善似的,就看看还有没有其他的方法了

这时就想到数据的级联了,看看hibernate的配置中能不能配置级联关系呢?

答案是可以。

将<many-to-one name="group" column="groupid" ></many-to-one> 改为

 

<many-to-one name="group" column="groupid" cascade="all"></many-to-one>

 

 cascade就是级联操作的意思,它主要级联sava 、update、delete操作。在这里本来是不能级联delete操作的,简单起见就把它的值定义成了all

然后还是用以前的那个没有加

session.save(group);的方法,看是不是能保存成功呢?

结果是这样的:


 

说明保存成功了。
 

 完成时,在逻辑上面考虑了一下,觉得还是加上group 的save操作比较好,这样在逻辑上面也比较好理解。

 

  • 大小: 48.5 KB
  • 大小: 17.4 KB
0
0
分享到:
评论

相关推荐

    Hibernate关联映射

    配置上,需要创建一个新的实体类来代表连接表,并在其中定义两个 `many-to-one` 属性,分别对应一对一关联的两个实体。 4. Hibernate 一对多外键单向关联: 在这种关联中,一个实体类(如 Department)可以有多个...

    hibernate 全面学习->hibernate 关联映射学习

    总的来说,这个压缩包提供了丰富的Hibernate关联映射的学习资源,涵盖了从基础到进阶的各种关联类型。通过学习这些示例,你将能够熟练掌握如何在Java项目中使用Hibernate进行数据持久化,并灵活地处理各种数据库关系...

    hibernate关联映射的作用和常用属性解释

    ### Hibernate关联映射的作用与常用属性详解 #### 关联映射概述 在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射...

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在Hibernate中,一对一唯一外键关联映射可以通过 `&lt;many-to-one&gt;` 标签来配置。例如,以下是Person实体与IdCard实体的一对一唯一外键关联映射配置: ```xml &lt;many-to-one name="idCard" column="card_id...

    Hibernate one-to-many / many-to-one关系映射

    "Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...

    (4)Hibernate中的many-to-one和one-to-many关系

    本话题主要探讨两种基本的关系映射类型:many-to-one(多对一)和one-to-many(一对多)。这两种关系映射是数据库中常见的关联类型,理解和掌握它们对于开发高质量的Java应用至关重要。 1. many-to-one关系 many-to...

    hibernate的关联映射

    【hibernate关联映射详解】 Hibernate 是一款流行的Java持久层框架,用于简化数据库操作。在Hibernate中,关联映射是实现对象关系映射(ORM)的关键,它允许我们在对象模型和关系数据库之间建立联系。关联映射主要...

    Hibernate one to many(many to one) 配置

    标题"Hibernate one to many(many to one) 配置"涉及到的是关系型数据库在Java中的持久化框架Hibernate中的两种关联映射关系:一对一(One-to-One)和多对一(Many-to-One)。在数据库设计中,这种关系很常见,例如...

    Hibernate 的关联映射

    "Hibernate的关联映射"是Hibernate中的核心概念之一,用于模拟数据库中的关系,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)四种关系。现在,让我们详细探讨...

    hibernate many to one

    在Java的持久化框架Hibernate中,"Many-to-One"关系是一种常见的关联映射类型,它表示一个实体(类)可以与多个其他实体实例相关联。在这个主题中,我们将深入探讨Hibernate如何处理这种关系,以及如何在实际编程中...

    Hibernate3.x关联映射示例

    本示例将深入探讨 Hibernate 3.x 中的关联映射,以帮助开发者更好地理解和应用这一关键技术。 关联映射是Hibernate中的核心概念之一,它允许我们将数据库中的表关系映射到对象之间的关系。主要的关联类型有以下几种...

    Hibernate 关联映射

    这可能是测试Hibernate关联映射的一个示例项目或者类。通常,这样的测试会包含各种关联映射的实例,如实体类的定义,配置文件或注解,以及测试用例,用于验证关联映射是否按预期工作。 **详细知识讲解:** 1. **一...

    hibernate中one2many映射

    在Java的持久化框架Hibernate中,One-to-Many映射是一种常见的关系映射方式,它表示一个实体(比如一个用户)可以与多个其他实体(比如用户的订单)进行关联。在这个场景下,"用户"是一方,称为"One","订单"是另...

    Hibernate Mapping Many-to-One 实例 内附源代码及附件下载

    本实例将详细讲解如何在Hibernate中实现Many-to-One关系映射,这是一种常见的数据库关联,表示一个实体可以与多个其他实体相关联。 在Many-to-One关系中,通常一个实体(如部门)可以有多个相关实体(如员工),而...

    hibernate关联关系映射

    "hibernate关联关系映射"是Hibernate的核心概念之一,它定义了如何在Java对象和数据库表之间建立关系。以下是对这个主题的详细讲解: 一、一对一关系映射(One-to-One) 一对一关系是指一个实体对应另一个实体的...

    Hibernate关联映射.doc

    ### Hibernate关联映射详解 #### 一、单向多对一映射 在单向多对一的关系中,主要是指“多方”实体依赖于“一方”实体,但是“一方”实体并不感知到“多方”的存在。 1. **数据库设计:**在多方的表中添加与一方...

Global site tag (gtag.js) - Google Analytics