hibernate的多对多例子讲解(加图片)
在hibernate中也有多对多的关系。但是这样关系执行的效率不高,所以我们可以通过两个多对1或者两个1对多来实现。
在现实生活中多对多的关系也比较常见。比如说老师和学生。一个老师有多个学生,一个学生也有多个老师。
如何实现老师和学生的关系我们可以建立一个中间表。中间表的作用就是关联老师和学生用的。
大家请看这个表:
这个3个表就是这种关系。现在我来写一个实例来实现以上的关系。
1teacher类
package com.fish.testdao;
import java.util.Set;
public class Teacher {
private int id;
private String name;
Set<Student> students;
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> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
2student类
package com.fish.testdao;
import java.util.Set;
public class Student {
private int id;
private String name;
Set<Teacher> teachers;
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> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
3.学生xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.fish.testdao.Student">
<id name="id" type="integer">
<generator class="increment"></generator>
</id>
<property name="name"></property>
<set name="teachers" table="teacher_student">//我们会产生一个老师学生关联表
<key column="student_id"></key>//然后我们会在这个表中产生一个student_id的字段
<many-to-many class="com.fish.testdao.Teacher"column="teacher_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
*注set就是用来做中间表的关联的。其实这个在一个表中有就可以了。这个set可以在techer的xml省去。当然写上也不会有错。
4.techer的xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.fish.testdao.Teacher">
<id name="id" type="integer">
<generator class="increment"></generator>
</id>
<property name="name"></property>
<set name="students" table="teacher_student">
<key column="teacher_id"></key>
<many-to-many class="com.fish.testdao.Student"column="student_id" />
</set>
</class>
</hibernate-mapping>
5.我们写一个测试方法。
packagecom.fish.domain;
importjava.util.HashSet;
import java.util.List;
import java.util.Set;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
importcom.fish.testdao.Student;
importcom.fish.testdao.Teacher;
public class Test4 {
public static Session getMySession() {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
SessionFactory factory =configuration.buildSessionFactory();
Session session = factory.openSession();
return session;
}
个表添加数据,这个方法里面我打了注释。因为如果你同时向中间表里面加数据,那肯定会报错的。试想两个set都是描述的是一种关系。那么同时插入一定会报错。
public static void add() {
// Set<Student> setStu = newHashSet<Student>();
Set<Teacher> setTea = newHashSet<Teacher>();
Teacher teacher = new Teacher();
Student student = new Student();
student.setName("qwe");
teacher.setName("黄老师");
// setStu.add(student);
setTea.add(teacher);
student.setTeachers(setTea);
// teacher.setStudents(setStu);
Session session = getMySession();
Transaction transaction = session.beginTransaction();
transaction.begin();
session.save(student);
session.save(teacher);
transaction.commit();
session.close();
}
public static void query() {
String hql = "from Teacher";
Session session = getMySession();
Query query = session.createQuery(hql);
List<Teacher> list = query.list();
for (Teacher i : list) {
System.out.println(i.getName() + "有学生:");
for (Student j : i.getStudents()) {
System.out.print(j.getName());
}
System.out.println();
}
session.close();
}
public static void main(String[] args) {
query();
}
}
接着我给你们看看这三个表的数据库中的数据。
查询结果是:
hibernate的多对多例子讲解(加图片)的更多相关文章
- 解析苹果的官方例子LazyTableImages实现图片懒加载原理
解析苹果的官方例子LazyTableImages实现图片懒加载原理 首先在官网下载源码: https://developer.apple.com/library/ios/navigation/#sec ...
- 用最简单的例子实现jQuery图片即时上传
[http://www.cnblogs.com/Zjmainstay/archive/2012/08/09/jQuery_upload_image.html] 最近看了一些jQuery即时上传的插件, ...
- 【SSH系列】Hibernate映射 -- 多对多关联映射
映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...
- Hibernate的多对多实例
在完成了一对多的实例的基础上,继续做多对多实例.例子是老师和学生,一个老师教多个学生,一个学生也有多个老师. 文档结构如图:
- Hibernate Validation使用示例及讲解
Hibernate Validation使用示例及讲解 时间 -- :: ITeye-博客 原文 http://wdmcygah.iteye.com/blog/2174680 主题 Java 在项目开 ...
- hibernate中多对多关联
hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程 ...
- Hibernate + Spring (quartz) 整合懒(延迟)加载问题
开发项目的时候 在一个Job中执行了数据库操作, 用的是懒加载,但是如下错误 org.hibernate.LazyInitializationException: failed to lazily i ...
- css transition transform animation例子讲解
1.transition属性: transition属性是一个速记属性有四个属性:transition-property , transition-duration, transition-timin ...
- hibernate 中 fetch=FetchType.LAZY 懒加载失败处理
对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,使得Hi ...
随机推荐
- Nginx在安装过程经常出现的问题
在Linux操作系统下搭建Nginx服务器,很多时候会出现不同的错误,在此我们在搭建过程中出现的错误进行一些总结: 主要问题有: 1.防火墙问题 2.缺少gc++ 3.缺少pcre.zlib库 解决办 ...
- 从此爱上iOS Autolayout
转:从此爱上iOS Autolayout 这篇不是autolayout教程,只是autolayout动员文章和经验之谈,在本文第五节友情链接和推荐中,我将附上足够大家熟练使用autolayout的教程 ...
- 如何在windows7上安装启明星系统。
启明星系统提供多种安装方式.安装包里自带了setup.exe.每个程序的 install下有在线安装(例如请假应用程序为book,则默认为 http://localhost/book/install ...
- ZZmsvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义 .的分析解决办法 (转)
很久没有写程式设计入门知识的相关文章了,这篇文章要来谈谈程式库 (Library) 连结,以及关于 MSVC 与 CRT 之间的种种恩怨情仇. 如果你使用的作业系统是 Linux.Mac 或其他非 W ...
- .NET中的流
当应用程序需要和磁盘上的文件打交道的时候,就有了流的概念.流就像架设在应用程序所在内存和磁盘之间的一个管道. 大致思路 → 建立管道 //FileMode.Open打开现有文件,另外还有FileMod ...
- 【高德地图API】如何设置Icon的imageSize?
在地图开发中,我们需要把标注换成各种各样的图片,以突显个性. 在高分辨率的手机下,图片尺寸需要压缩至一半,以保持图片清晰.让我们来看一看,应该如何实现. 有开发者为了改变图片的尺寸,直接写成了 ...
- centos 开启启动服务优化
默认开机启动服务列表:(此表转自 http://www.ha97.com/4815.html,另有多处补充) 服务名称 功能 默认 建议 备注说明 NetworkManager 用于自动连接网 ...
- iOS 7.1 UITableView添加footerView 后 最后一行分割线无法显示
今天用故事版 遇到个奇怪的问题: 我要用 tbView(tableView)展示写信息.最后一行我要显示些文案什么的.考虑用 footerView ,开心coding ..,show下 哪里有些不对吧 ...
- 安装redis监控
在修改登录中心的时候,数据存储在redis里面,需要对redis进行监控,使用的是Redis-Live 参考文章: http://www.nkrode.com/article/real-time-da ...
- 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花 数 ",因为153=1的三次方+5的三次方+3的三次方。
题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个 "水仙花 数 ", ...