- 浏览: 344863 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
zy_mensheng:
请问一下 怎么 js没有解析啊 还是钟表图..
调用BIEE提供的web service -
安铁辉:
师兄你很久没更新博客了
Information Dashboard Design读书笔记 -
mojunbin:
很清晰的文章
秒杀相关知识以及技术 -
yanchangjun8102:
楼主你好,我也最近在研究biee的webservice这块,按 ...
调用BIEE提供的web service -
sacredon:
不错,楼主我是看着你的这篇文章写代码调用的BIEE的Web ...
调用BIEE提供的web service
多对多关联关系的映射
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;hibernate会为我们创建中间关联表,转换成两个一对多。
核心配置:
<set name="ss" table="teacher_student">
<key column="teacher_id"></key>
<many-to-many class="Student" column="student_id"></many-to-many>
</set>
Teacher类代码如下:
public class Teacher { private int id; private String name; private Set<Student> ss=null; 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 Set<Student> getSs() { return ss; } public void setSs(Set<Student> ss) { this.ss = ss; } }
teacher.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 package="many2many">
<class name="Teacher" table="teacher">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="ss" table="teacher_student">
<key column="teacher_id"></key>
<many-to-many class="Student" column="student_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Student类代码如下:
public class Student { private int id; private String name; private Set<Teacher> ts=null; 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 Set<Teacher> getTs() { return ts; } public void setTs(Set<Teacher> ts) { this.ts = ts; } }
student.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 package="many2many">
<class name="Student" table="student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="ts" table="teacher_student">
<key column="student_id"></key>
<many-to-many class="Teacher" column="teacher_id"></many-to-many>
</set>
//集合标签,通过student_id到关联表teacher_student中查到相应的teacher的id,在利用teacher_id到teacher表中具体的查找teacher信息。
</class>
</hibernate-mapping>
测试代码如下:
public class Main { public static void main(String[] args) { add(); } static void add() { Set<Teacher> ts = new HashSet<Teacher>(); Set<Student> ss = new HashSet<Student>(); Teacher t1 = new Teacher(); t1.setName("t1"); ts.add(t1); Teacher t2 = new Teacher(); t2.setName("t2"); ts.add(t2); Student s1 = new Student(); s1.setName("s1"); ss.add(s1); Student s2 = new Student(); s2.setName("s2"); ss.add(s2); t1.setSs(ss); t2.setSs(ss); Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); s.save(t1); s.save(t2); s.save(s1); s.save(s2); tx.commit(); } }
程序执行完毕后,数据库中有三个表:teacher表,student表,关联表teacher_student表。
表结构为:
teacher(id,name)
student(id,name)
teacher_student(teacher_id,student_id)
hibernate会执行四条插入语句,分别把teacher和student信息插入到teacher表和student表中。由于在以上代码中设置了老师知道学生集合,所以还要把教师和学生的多对多关系体现到teacher_student表中去。
还要有四条插入语句。
具体如下:
Hibernate: insert into teacher (name) values (?)
Hibernate: insert into student (name) values (?)
Hibernate: insert into student (name) values (?)
Hibernate: insert into teacher_student (teacher_id, student_id) values (?, ?)
Hibernate: insert into teacher_student (teacher_id, student_id) values (?, ?)
Hibernate: insert into teacher_student (teacher_id, student_id) values (?, ?)
Hibernate: insert into teacher_student (teacher_id, student_id) values (?, ?)
值得注意的是,在以上代码中,只对老师做了setSs操作,而没有对学生做setTs操作,这样没有问题。如果同时做,会重复的将数据插入到关联表中去,这样就会产生12条插入语句,这样会导致插入重复数据错误。所以只需对一方做了设置即可,不需要同时设置。让老师知道学生或者学生知道老师即可,二选其一。
对以上问题还有一种解决方案:就是使用inverse,让老师放弃对关系的维护。
<?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 package="many2many">
<class name="Teacher" table="teacher">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="ss" table="teacher_student" inverse="true"
>
<key column="teacher_id"></key>
<many-to-many class="Student" column="student_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
测试代码:
static void add() {
Set<Teacher> ts = new HashSet<Teacher>();
Set<Student> ss = new HashSet<Student>();
Teacher t1 = new Teacher();
t1.setName("t1");
ts.add(t1);
Teacher t2 = new Teacher();
t2.setName("t2");
ts.add(t2);
Student s1 = new Student();
s1.setName("s1");
s1.setTs(ts);
ss.add(s1);
Student s2 = new Student();
s2.setName("s2");
s2.setTs(ts);
ss.add(s2);
t1.setSs(ss);
t2.setSs(ss);
Session s = HibernateUtil.getSession();
Transaction tx = s.beginTransaction();
s.save(t1);
s.save(t2);
s.save(s1);
s.save(s2);
tx.commit();
}
以上代码中,对教师和学生做了双向关联,按理会对中间表产生8条插入语句。但是我们在配置文件中,让教师放弃了对关系的维护,所以hibernate就忽略了,从而达到了同样的效果,又可以正确的设定对象模型的关系,又不会产生表主键重复的错误。
设计问题小结:
一般不设计成一对多,而保留多对一。
比如部门和员工的关系。一般在员工类中包含有部门这个属性,其实也可以在部门中拥有一个集合属性,包含它的所有员工,对于数据量不大的情况下可以这样用。但是如果多的一方的数据很多的话,会带来性能问题。向论坛上的一个帖子有若干个回复,采用的是分页查询来回避该问题。所以最好通过员工来导航到部门,而不是通过部门导航到员工,即部门中一般不加上set<Employee>属性。
更不用说,多对多映射涉及到多表查询带来极大的性能开销。要知道多表操作所带来的性能消耗相当客观,所以最好将它转换为其他的方式来处理 。
发表评论
-
hibernate学习之十八篇
2009-03-16 17:27 810hibernate不适合的场景: 1,不适合OLAP(on- ... -
hibernate学习之十七篇
2009-03-16 12:31 993零碎知识小结: ◆数据类型: 1,<propert ... -
PO and POJO
2009-03-11 23:49 823原文:http://danni505.blog.51cto.c ... -
hibernate学习之第十六篇
2009-03-11 21:36 1471session context和事务边界 用current_ ... -
hibernate学习之第十五篇
2009-03-11 21:33 1034事务与事务边界 hibernat ... -
Hibernate二级缓存攻略(转)
2009-03-09 22:56 845Hibernate二级缓存攻略(转) 很多人对二级缓存都不太 ... -
hibernate学习之第十四篇
2009-03-09 17:48 1173hibernate的内部缓存 hibernate的缓存分为 ... -
hibernate学习之第十三篇
2009-03-09 17:41 1011load方法的懒加载及原理分析 懒加载的目的,减少不必要的数 ... -
hibernate学习之第十二篇(续)
2009-03-06 19:10 988《四》每个具体类映射 ... -
hibernate学习之第十二篇
2009-03-06 15:57 947《三》混合使用“一个 ... -
hibernate学习之第十一篇(2)
2009-03-05 23:00 896《二》每个子类映射到一张表(joined-subclass) ... -
hibernate学习之第十一篇(1)
2009-03-05 22:55 1478hibernate的继承映射 《一》一张表映射一棵继承树 ... -
hibernate学习之第十篇
2009-03-05 13:53 1124级联和关系维护 Cascade 用来说明当对主对象进行某种操 ... -
hibernate学习之第九篇
2009-03-04 22:52 1343hibernate中的集合类型 引入: Hibernate ... -
hibernate学习之第八篇
2009-03-03 22:11 996组件映射 关联的属性是个复杂类型的持久化类,但不是实体即: ... -
hibernate 学习之第六篇
2009-03-02 20:31 924基于主键的一对一关联 Person类和IdCard,一对一 ... -
深入浅出hibernate摘录2
2009-03-02 00:38 1513以下内容摘自深入浅出hibernate 在编写代码的时候,尽 ... -
深入浅出hibernate摘录
2009-03-01 19:45 1236以下摘自深入浅出hiberna ... -
hibernate学习之第五篇
2009-03-01 19:43 10761, oracle数据库中,user是关键字,如果用户的表名为 ... -
hibernate学习之第四篇(对象状态)
2009-03-01 19:38 1080session 的几个主要方法 ...
相关推荐
Hibernate是一款强大的Java持久...通过阅读这份“Hibernate API帮助文档”和“Hibernate学习笔记”,你将能够深入理解Hibernate的工作原理,掌握其API的使用,并能在实际项目中有效地利用Hibernate进行数据持久化操作。
本篇将主要围绕`Hibernate3中文参考手册`展开,深入探讨Hibernate的基础概念、配置、实体映射、查询语言以及其他关键特性。 1. **Hibernate概述** Hibernate是一个开源的ORM框架,它提供了对Java应用程序的数据库...
【hibernate教程-从入门到精通-第4篇(共四篇)共2】这篇教程是关于Java持久层框架Hibernate的学习指南,旨在帮助初学者深入理解并掌握Hibernate的核心概念和技术。Hibernate作为一款强大的对象关系映射(ORM)工具,...
在本篇“Hibernate学习笔记(三)”中,我们将深入探讨Hibernate这一强大的Java持久化框架。Hibernate是一个对象关系映射(ORM)工具,它允许开发者用面向对象的方式处理数据库操作,极大地简化了Java应用程序与...
本教程旨在提供一个全面的Hibernate学习路径,让你能够熟练地运用Hibernate进行数据库操作,提升开发效率。通过深入学习,你将掌握如何利用Hibernate进行对象关系映射(ORM),事务管理,查询优化以及与其他技术如...
**hibernate学习笔记** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。这篇学习笔记将带你深入理解Hibernate的核心概念、配置、实体映射以及基本操作。 ## 一、...
总结,本篇笔记主要介绍了Hibernate的基本使用,包括环境配置、项目构建、DAO设计以及具体的数据库操作实现,提供了从创建对象到持久化到数据库的完整流程。通过这种方式,开发者可以更加专注于业务逻辑,而不用过于...
【标题】"Hibernate之第1解之-hibernate_demo_1" 涉及的主要内容是对Hibernate框架的基础理解和应用,这是Java开发中一个重要的持久化工具。这篇博客可能详细介绍了如何搭建Hibernate开发环境,以及进行初步的数据...
本篇文档将深入探讨Hibernate的核心概念、配置、实体映射以及常用操作。 **一、Hibernate概述** Hibernate是一个开源的ORM框架,它的主要功能是将Java对象与数据库表进行映射,实现了对象的持久化。通过使用...
这篇文档集合了丰富的Hibernate实践知识,对于初学者来说是一份宝贵的资源。 1. **Hibernate核心概念** Hibernate的核心在于持久化对象,它允许我们将Java类映射到数据库表,对象的属性对应于表的列。实体类是Java...
在本篇文章中,我们将深入探讨Hibernate 3.2.5中的核心概念、特性以及它如何简化Java数据库编程。 1. **对象关系映射(ORM)**:Hibernate作为ORM工具,将Java对象与数据库表进行映射,使得开发者可以处理Java对象...
总的来说,这份教程旨在通过实例和练习帮助学习者熟练掌握Hibernate框架的核心功能,包括实体映射、事务管理、关联配置以及关联的自动加载。通过学习这些内容,开发者能够有效地使用Hibernate来简化Java应用程序中的...
这篇关于“hibernate测试”的文章旨在深入探讨Hibernate的核心概念,以及如何进行有效的测试以确保其在项目中的稳定运行。 1. **Hibernate简介** Hibernate是一个开源的Java库,它为Java应用程序提供了一个框架,...
### Hibernate学习笔记精要 #### 一、HelloWorld与Hibernate入门 **HelloWorld**是学习任何新技术时的经典第一个程序,Hibernate也不例外。通过构建一个简单的Java项目`hibernate_0100_HelloWorld`,我们可以熟悉...
《Hibernate学习笔记》是一份深度剖析Hibernate框架的教程,旨在为初学者提供全面而深入的指导,帮助他们快速掌握这个强大的Java对象关系映射(ORM)工具。Hibernate作为Java领域中广泛使用的ORM解决方案,它极大地...
本篇文章将基于“hibernate3.0立体文档”中的32个示例,深入探讨Hibernate的核心概念、工作原理以及常见用法。 一、Hibernate概述 Hibernate是Java开发中的一个持久化框架,它通过提供一种对象-关系映射机制,将...
第7篇为EJB与Web服务篇,内容包括EJB 3概述、JPA规范Web服务框架XFire等;第8篇为工具篇,内容包括在Java Web项目中常用的开源工具框架、主要有版本管理工具SVN、日志工具commons-logging与Log4J、报表图形引擎...
本篇文章将围绕Hibernate 4.1.4.Final版本的源码进行深入探讨,揭示其内部机制,帮助读者提升对Hibernate的理解和应用水平。 一、Hibernate概述 Hibernate是一个开源的ORM框架,它实现了Java持久化模型,将数据库...