- 浏览: 184834 次
- 性别:
- 来自: 青岛
文章分类
- 全部博客 (117)
- java基础知识 (17)
- 技术积攒 (9)
- Oracle技术 (4)
- JSP技术 (6)
- Spring技术 (15)
- Linux技术 (6)
- Hibernate技术 (24)
- JPA技术 (1)
- Struts技术 (1)
- Struts2技术 (6)
- javascript知识 (4)
- myeclipse 使用技巧 (3)
- JavaEE技术 (2)
- JSTL (1)
- javamail技术 (1)
- jaf 技术 (1)
- 测试方法 (1)
- web技术积攒 (1)
- tomcat事项 (5)
- mysql使用 (1)
- 趣味题目 (2)
- 技术词汇 (1)
- EJB3.0 (2)
- weblogic 使用说明 (1)
- CSS (1)
最新评论
-
chenhao_java:
知识点五:依赖注入-自动装配依赖对象 -
黑白配:
为什么没有看见三个附件呢?
JavaMail jsp发送邮件 html格式 -
chunchong:
真晕,这样怎么能行呢
JAVA中防止SQL注入攻击类的源代码 -
Rod_johnson:
学习了!真不错
Hibernate:类继承的实现方式(二)--父子类各自一个表 -
erchong2011:
恩 很不错 学习了 简单
jsp页面自动跳转方式
Hibernate处理多对多的情况,在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型:Hibernate会为我们创建中间关联表,转换成两个一对多。
POJO对象:
映射文件:
因为由中间表,所以现在要找一个教师的所有学生,应该根据映射文件,首先找到此教师的id,然后到中间表中根据此教师id找到它对应的学生id,然后拿着此学生的id到学生表中找到一条学生信息。所以配置的选项:
1 要找此教师的学生,应该找到学生集合的属性名 students,依据<set name="students" table="teacher_student">
2 在里面同时指定了要找的中间表,要知道中间表中教师的id对应的字段
<key column="teacher_id"/>
3 在此中间表中找到一条此教师id:teacher_id对应的学生的id:student_id;
4 拿着此学生id到学生表中找到一条符合条件的记录(在对象模型中也就是一个学生对象)
测试类:
注意,多对多的插入实际上是在中间表中加数据的,而且中间表的表结构,是以两个对象的主键组合作为主键,也就是联合主键,也就是说a,b与b,a是认为重复的!!所以在添加的时候只在一方添加即可!!
可以看到表结构的主键为联合主键,所以要是在两端都添加会有冲突!
t1.setStudents(stuSet);
t2.setStudents(stuSet);
//s1.setTeachers(teaSet);
//s2.setTeachers(teaSet);
就是说只能执行上面两句或者下面两句!!要是全部执行就构成了重复
多对多的查询:
可以看到到中间表去查一个教师有多少个学生!!!所以查询需要三个表,效率低下,而且如果关联多个对象,比如一个热帖回复有1万个,这样,利用getSet()就会得到一万多条数据,所以尽量少用。
POJO对象:
import java.util.Set; public class Student { private Integer id; private String name; private Set<Teacher> teachers; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } }
import java.util.Set; public class Teacher { private Integer id; private String name; private Set<Student> students; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } }
映射文件:
<?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 package="cn.itcast.hibernate.domain"> <class name="Student" table="student"> <id name="id"> <generator class="native" /> </id> <property name="name"/> <set name="teachers" table="teacher_student"> <key column="student_id"/> <many-to-many class="Teacher" column="teacher_id"/> </set> </class> </hibernate-mapping>
因为由中间表,所以现在要找一个教师的所有学生,应该根据映射文件,首先找到此教师的id,然后到中间表中根据此教师id找到它对应的学生id,然后拿着此学生的id到学生表中找到一条学生信息。所以配置的选项:
1 要找此教师的学生,应该找到学生集合的属性名 students,依据<set name="students" table="teacher_student">
2 在里面同时指定了要找的中间表,要知道中间表中教师的id对应的字段
<key column="teacher_id"/>
3 在此中间表中找到一条此教师id:teacher_id对应的学生的id:student_id;
4 拿着此学生id到学生表中找到一条符合条件的记录(在对象模型中也就是一个学生对象)
<?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 package="cn.itcast.hibernate.domain"> <class name="Teacher" table="teacher"> <id name="id" unsaved-value="-1"> <generator class="native" /> </id> <property name="name"/> <set name="students" table="teacher_student"> <key column="teacher_id"/> <many-to-many class="Student" column="student_id"/> </set> </class> </hibernate-mapping>
测试类:
import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import cn.itcast.hibernate.HibernateUtil; import cn.itcast.hibernate.domain.Student; import cn.itcast.hibernate.domain.Teacher; public class ManyToManyTest { public static void main(String[] args) { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Set<Student> students = new HashSet<Student>(); Set<Teacher> teachers = new HashSet<Teacher>(); Student student1 = new Student(); student1.setName("学生1"); Student student2 = new Student(); student2.setName("学生2"); Teacher teacher1 = new Teacher(); teacher1.setName("教师1"); Teacher teacher2 = new Teacher(); teacher2.setName("教师2"); students.add(student1); students.add(student2); teachers.add(teacher1); teachers.add(teacher2); student1.setTeachers(teachers); student2.setTeachers(teachers); //下面两条千万不能要!因为中间表采用的是联合主键,所以只要一端加入即可 //如果加入两次,就会出现主键冲突 //teacher1.setStudents(students); //teacher2.setStudents(students); session.save(student1); session.save(student2); session.save(teacher1); session.save(teacher2); tx.commit(); session.close(); } }
注意,多对多的插入实际上是在中间表中加数据的,而且中间表的表结构,是以两个对象的主键组合作为主键,也就是联合主键,也就是说a,b与b,a是认为重复的!!所以在添加的时候只在一方添加即可!!
可以看到表结构的主键为联合主键,所以要是在两端都添加会有冲突!
t1.setStudents(stuSet);
t2.setStudents(stuSet);
//s1.setTeachers(teaSet);
//s2.setTeachers(teaSet);
就是说只能执行上面两句或者下面两句!!要是全部执行就构成了重复
多对多的查询:
Student student = (Student)session.get(Student.class, 1); Set<Teacher> teachers = student.getTeachers(); for(Teacher teacher : teachers){ System.out.println(teacher.getName()); }
Hibernate: select student0_.id as id6_0_, student0_.name as name6_0_ from student student0_ where student0_.id=? Hibernate: select teachers0_.student_id as student2_1_, teachers0_.teacher_id as teacher1_1_, teacher1_.id as id4_0_, teacher1_.name as name4_0_ from teacher_student teachers0_ left outer join teacher teacher1_ on teachers0_.teacher_id=teacher1_.id where teachers0_.student_id=?
可以看到到中间表去查一个教师有多少个学生!!!所以查询需要三个表,效率低下,而且如果关联多个对象,比如一个热帖回复有1万个,这样,利用getSet()就会得到一万多条数据,所以尽量少用。
发表评论
-
关于Hibernate一个配置参数hibernate.hbm2ddl.auto
2010-03-02 08:43 1147<?xml version="1.0" ... -
Hibernate 复合主键
2009-09-25 09:13 1567[zt]hibernate复合主键 key words:hi ... -
映射文件class元素的dymanic-insert和dymanic-update的作用
2009-06-05 09:36 915SQL update语句是预先生成的,如果加上dynamic的 ... -
hibernate的各种保存方式的区别
2009-06-05 08:59 664hibernate的保存 hibernate对于对象的保存提供 ... -
Hibernate:缓存设置
2009-06-04 16:38 1012缓存是介于应用程序 ... -
one-to-many的懒加载及原理分析
2009-06-04 14:42 904如果是一对多,多对一,甚至是多对多那效率就差别大了!!如果一对 ... -
one-to-one的懒加载及原理分析
2009-06-04 13:57 1019Lazy=”” :告诉hibernate什么时候抓取 1 fa ... -
load方法的懒加载及原理分析
2009-06-04 11:09 1815懒加载: load方法与get ... -
Hibernate:类继承的实现方式(四)--每个具体类映射一张独立表
2009-06-04 10:58 1013这种方式会把继承链的所有类保持到数据库中单独的表中,而且标语表 ... -
Hibernate:类继承的实现方式(三)--鉴别器与内连接相结合
2009-06-04 10:49 1107当子类中有的有很多自己特有的属性,而部分子类有较少的自己的属性 ... -
Hibernate:类继承的实现方式(二)--父子类各自一个表
2009-06-04 10:41 1396将继承链中的各个类映射到数据库中的一个单独的表中 domai ... -
Hibernate:类继承的实现方式(一)--父子类在同一个表中
2009-06-04 10:19 1892Hibernate对继承关系的对象的处理分为多种形式: 第一 ... -
cascade和inverse
2009-06-04 09:10 1352Cascade与inverse这两个属性都用于一对多或者多对多 ... -
关联关系的级联操作
2009-06-03 17:17 854Cascade和inverse (Employee-Depar ... -
POJO对象与映射文件 : 集合映射
2009-06-03 15:36 1243集合属性大致有两种:第一种是单纯的集合属性,如像 List、S ... -
关联关系的总结
2009-06-03 14:50 772查询的时候出现sql语句的条数: Hibernate查询输出 ... -
将一个对象(组件)作为属性,但是不想建立这个表
2009-06-03 14:38 815如果对象的某个属性为一个对象,而且不想单独对该对象建立一个表, ... -
Hibernate:一对一(2)
2009-06-03 11:11 796Hibernate处理一对一的另外一种方式是:将多对一加上唯一 ... -
Hibernate:多对一
2009-06-03 11:05 906Hibernate对多对一有两种,分为单向和双向。一般都是采用 ... -
Hibernate:一对一(1)
2009-06-03 10:40 798Hibernate中一对一关联两种处理方式之一:参照表主键参照 ...
相关推荐
2. **对象关系映射(ORM)**:详述Hibernate的实体类、注解和XML映射文件,如何定义对象的属性与数据库字段的对应关系,以及如何处理一对多、一对一、多对多等复杂关系。 3. **Session和Transaction管理**:讲解...
此外,本书还会深入到Hibernate的高级特性,如级联操作、延迟加载、集合映射、多态映射、关联映射(一对一、一对多、多对多)等。这些特性让开发者能够处理复杂的数据结构和业务逻辑。例如,级联操作允许一次操作就...
一共有三个分卷。全部下载才能解压。 这本书不错,值得一看。
精通 Hibernate:Java 对象持久化技术详解 第2版 学习Hibernate必备得一本书
2. **Chapter 3**: 深入讨论了实体类和数据表的映射,包括实体类的定义,属性与数据库字段的对应,以及一对一、一对多、多对多等关联关系的映射。这部分还可能涉及到了`@Entity`, `@Table`, `@Id`, `@GeneratedValue...
### 关于《Beginning Hibernate: For Hibernate 5》的知识点总结 #### Hibernate 5 概述 - **定义**: Hibernate 是一款流行的开源对象关系映射(ORM)框架,它简化了数据库与 Java 对象之间的交互过程。 - **版本**...
《精通Hibernate:Java持久化对象技术详解[第二版]》是一部深入探讨Hibernate框架的专业书籍,旨在帮助Java开发者熟练掌握和运用这一强大的ORM(Object-Relational Mapping)工具。Hibernate是Java开发领域中广泛...
7. **多对一、一对多、多对多关系映射**:Hibernate支持复杂的关联关系映射,如单向关联、双向关联、自关联等。 8. **继承映射**:允许开发者使用Java的继承结构来设计数据库表,如单表继承和联合继承。 9. **延迟...
本项目“Hibernate学习:单向多对一关联 工程”专注于讲解Hibernate中的单向多对一关联映射,这是数据库设计中常见的关系类型,尤其在处理具有层次结构的数据时。 单向多对一关联指的是在一个实体类中有一个引用,...
精通HibernateJava对象持久化技术详解(第2版)jar文件.zip) annotations-api.jar antlr-2.7.6.jar catalina-ant.jar catalina-ha.jar catalina-tribes.jar catalina.jar commons-collections-3.1.jar commons-...
精通Hibernate:Java对象持久化技术详解(第2版)源码精通Hibernate:Java对象持久化技术详解(第2版)源码精通Hibernate:Java对象持久化技术详解(第2版)源码精通Hibernate:Java对象持久化技术详解(第2版)源码
官网hibernate:问题说明: 1、安装整合通过; 2、整合时注意javassist-3.22.0-GA.jar与struts2.4的 javassist-3.20.0-GA.jar重复; 3、整合所需基础包以及整合需要的外部包,自己放到一个新建文件夹中,方便大家...
同时,关联关系如一对一、一对多、多对一、多对多也能通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany进行定义。 3. Hibernate配置:学习如何配置Hibernate,包括hibernate.cfg.xml文件的编写,数据库连接参数...
- 复杂类型映射:包括一对多、多对一、一对一、多对多关系的映射。 - 组合映射:对于复杂对象结构,可以使用组件或集合来映射。 这个系列教程可能涵盖了以上部分或全部内容,并且从01到02逐步深入。从提供的...
- `@OneToMany`、`@ManyToOne`、`@OneToOne`、`@ManyToMany`:表示不同类型的关联关系,例如一对多、多对一、一对一和多对多。 3. **配置自动建表**: - 在Hibernate的配置文件(hibernate.cfg.xml)中,可以通过...
hibernate:one-to-one 的学习小经验
标题"Hibernate多对多实例+数据库代码"揭示了我们将在讨论一个使用Hibernate框架实现的多对多关系映射的实际案例。在这个实例中,开发人员将两个或多个实体之间的复杂关联转化为简单易懂的数据库操作。描述中提到...
包含hibernate所有所需jar包还有一些其他包日志包、jpa支持包等: 列如:hibernate-core-5.1.0.Final.jar hibernate-ehcache-5.1.0.Final.jar hibernate-entitymanager-5.1.0.Final.jar hibernate-envers-5.1.0....
本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,...