`
yxwang0615
  • 浏览: 560839 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

hibernate3.2(六)多对一关联映射

阅读更多

多个用户对应一个组,要在用户中体现出多对一,所以用户中要private Group group

public class User {
	private int id;//给实体一个唯一性的标识
	private String name;
	private Group group;
                getter and setter...
	
}

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 对类进行映射,name = "完整路径" , 默认存的表和实体类的名字一致,
          可以用 table = "xxx"更改生成的数据库表-->
	<class name="com.wyx.hibernate.User" table="t_user">
		<!-- 标识 数据表默认字段和实体属性名一致,可用column="xxx"来重新定义字段名-->
		<id name="id" column="u_id">
		    <!-- 主键的生成策略 uuid全局的唯一标识,32位字符串,一般一万年不会重复-->
		    <!-- native 自动根据方言识别 -->
			<generator class="native"/>
		</id>
		<!-- 除了标识以外,都用property来映射 ,生成的字段可以重命名,unique="true"标识唯一-->
		<property name="name" column="u_name"  not-null="true" length="30"/>
		<many-to-one name="group" column="u_group" />
	</class>
</hibernate-mapping>

 省略group实体和hbm.xml,注意hbm文件中class标签中要制定table别名,因为默认生成的表group是数据库的关键字,会出错的。

 

执行测试方法:

public void testReference(){
		Session session = HibernateUtils.getSession();
		try {
			session.beginTransaction();
			
			Group group = new Group();
			group.setName("一起探索");
			
			User user1 =new User();
			user1.setName("张三");
			user1.setGroup(group);
			
			User user2 =new User();
			user2.setName("李四");
			session.save(group);
			//不能成功保存
			session.save(user1);
			System.out.println("----------mark1------------");
			session.save(user2);
			System.out.println("----------mark2------------");
			//session.save(group);
			//System.out.println("----------mark3------------");
			session.getTransaction().commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			HibernateUtils.closeSession(session);
		}
	}

 

 这里会报错:

org.hibernate.TransientObjectException.

原因是:

group为transient状态 ,id我们设定为hibernate帮我们自增,id是在session.save方法后,也就是group状态变为persistent才有id,hibernate才给你自动赋值。这里group的id还没有值就被user引用了。去掉注释部分可成功运行。

结论:persistent状态对象是不能引用transient对象,这个错误不注意会经常遇到。

 

那么不存group,有没有办法能不能成功存入user呢?

通过级联操作可以。

级联是对象的连锁操作

级联适合删除、保存、修改。

 

在user.hbm.xml中设置manytoone标签的cascade属性设置为all或save-update,默认是none。

这样在保存person对象的时候,hibernate自动为我们保存group对象,这样person依赖的group数据也就存在了,就可以成功保存内容到数据库。

 

cascade属性设置为除了none以外任何有意义的值, 它将把特定的操作传递到关联对象中。这个值就代表着Hibernate基本操作的名称, persist, merge, delete, save-update, evict, replicate, lock, refresh, 以及特别的值delete-orphanall,并且可以用逗号分隔符 来组合这些操作,例如,cascade="persist,merge,evict"cascade="all,delete-orphan"

 

console打印:

Hibernate: insert into t_group (g_name) values (?)
Hibernate: insert into t_user (u_name, u_group) values (?, ?)
----------mark1------------
Hibernate: insert into t_user (u_name, u_group) values (?, ?)
----------mark2------------

 

 

下面来做个例子,从用户中加载组的信息:

 

	public void testReferenceLoad(){
		Session session = HibernateUtils.getSession();
		try {
			session.beginTransaction();
			User user = (User)session.load(User.class, 5);
			System.out.println("user.name = " + user.getName()+" user.group.name = " + user.getGroup().getName());
			session.getTransaction().commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			HibernateUtils.closeSession(session);
		}
	}

 Console:

Hibernate: select group0_.g_id as g1_1_0_, group0_.g_name as g2_1_0_ from t_group group0_ where group0_.g_id=?
user.name = 张三 user.group.name = 一起探索

这里不管casecade的值设为任意的都不影响级联查询的进行,因为级联只影响增、删、改的操作。

级联查询真正起作用的是User.hbm.xml中的many-to-one标签。

 

<many-to-one>会在“多”的一方加入外键,指向“一”的一方,这个外键是由该标签下的column属性定义的,即不加column属性默认与“一”的一方的属性名字相同。

 

 

分享到:
评论

相关推荐

    struts1.2 + spring2.5 + hibernate3.2框架demo

    总结来说,这个demo项目提供了一个学习和实践Struts1.2、Spring2.5和Hibernate3.2集成的平台,涵盖了MVC设计模式、依赖注入、面向切面编程和对象关系映射等多个关键概念。通过深入研究和修改这个项目,开发者能够...

    开发框架 hibernate3.2

    6. **一对多、多对一、一对一关联映射** - 通过@ManyToOne、@OneToMany、@OneToOne注解定义不同类型的关联关系,简化了数据间的关联操作。 7. **延迟加载(Lazy Loading)** - Hibernate支持属性和关联的懒加载,...

    hibernate3.2

    Hibernate 3.2 是一个非常重要的Java持久化框架版本,它极大地简化了数据库与Java对象之间的交互,使得开发者能够更加专注于业务逻辑而不是繁琐的数据访问层实现。本篇将深入探讨Hibernate 3.2的主要特性、核心概念...

    hibernate3.2lib及源码jar包纯净版

    6. **关联映射**:支持一对一、一对多、多对一、多对多等多种关联关系的映射。 在使用这两个JAR文件时,开发者需要确保有相应的JDBC驱动以连接数据库,并配置Hibernate的配置文件(如hibernate.cfg.xml),定义...

    Hibernate3.2整套源码

    通过对Hibernate 3.2源码的阅读和分析,开发者可以深入理解其内部机制,学习如何优化数据访问,如何处理复杂的关联关系,以及如何实现更高效的缓存策略。这对于提升Java企业级应用的开发能力具有极大的价值。

    Hibernate3.2官方中文参考手册 高清晰 pdf

    - **一对多映射**:处理实体间的多对一或多对多关系。 - **继承映射**:支持不同类型的继承关系映射到数据库。 #### 六、查询语言 - **HQL (Hibernate Query Language)**:面向对象的查询语言,类似于 SQL 但更...

    hibernate_3.2官方开发包

    11. **Association Mapping关联映射**:Hibernate支持一对一、一对多、多对一、多对多等各种关联映射,方便地处理复杂的对象关系。 12. **延迟加载Lazy Loading**:Hibernate的懒加载机制可以推迟到真正需要时才...

    Hibernate3.2官方中文参考手册.pdf+Hibernate.pdf(Hibernate的学习资料)

    5. **关系映射(Relationship Mapping)**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)关系。理解这些关系的配置和使用是掌握Hibernate的关键。 6. **会话(Session...

    hibernate3.2用到的jar包

    11. **关联映射**:Hibernate 支持一对一、一对多、多对一和多对多的关系映射,通过注解或XML配置来定义实体之间的关联。 12. **延迟加载(Lazy Loading)**:为了优化性能,Hibernate 实现了延迟加载机制。默认...

    Hibernate3.2_API

    Hibernate3.2_API 是一套针对该版本的API文档和指南,对理解并使用Hibernate 3.2提供了详细指导。 1. **对象关系映射(ORM)**:ORM是一种编程技术,它通过在对象和关系数据库之间创建映射,简化了数据访问。...

    hibernate3.2 源码

    9. **集合映射**:在实体类中,可以定义一对多、一对一、多对一、多对多的关系。Hibernate提供了丰富的集合类型(如List、Set、Map等)来映射这些关系。 10. **延迟加载(Lazy Loading)**:为了提高性能,...

    hibernate-3.2源代码

    Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。在Hibernate 3.2版本中,开发者们能够更深入地理解其内部机制,从而提高开发效率和应用性能。本篇文章将详细解析...

    hibernate3.2级联关系自身一对多双向关联

    在Java持久化领域,Hibernate是一个广泛应用的ORM(对象...在实际项目中,这种关联模式常用于构建社交网络、组织结构、多对多关系的中间表等多种场景。因此,深入学习和实践这部分内容对于提升Java开发能力非常有帮助。

    hibernate3.2参考文档

    3. **实体映射**:讲解如何使用Hibernate的XML映射文件(.hbm.xml)或注解来定义Java类与数据库表之间的映射关系,包括字段映射、主键生成策略、关联映射(一对一、一对多、多对一、多对多)等。 4. **Session接口*...

    hibernate3.2源码

    9. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)等关系映射,以及懒加载和立即加载策略。 10. **类型系统和用户类型**:Hibernate支持多种内置类型...

    hibernate-3.2 源码

    3. 集合映射:一对多、多对多关系的映射,如Set、List、Map等集合类型的处理。 4. 异步查询:通过Hibernate的FutureResult和Query.listAsync()实现异步数据检索。 5. 动态模型:无需预先定义实体类,可以动态构建...

    Hibernate\hibernate3.2官方中文参考手册PDF

    5. **关联映射**:Hibernate支持多种对象之间的关联映射,包括一对一、一对多、多对一、多对多关系。这些关联可以在配置文件中定义,或者使用JPA注解来声明。 6. **集合映射**:在处理一对多、多对多关联时,...

    hibernate3.2API

    5. **关联映射**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等关系的映射,通过`@OneToOne`、`@OneToMany`等注解实现。 6. **事件监听**:Hibernate允许注册监听器...

Global site tag (gtag.js) - Google Analytics