Hibernate关联学习之---多对多关联
来源:互联网 发布:linux web日志 编辑:程序博客网 时间:2024/04/29 11:04
有两个实Student和Course,他们之间的关系是多对多,在数据库上,为了满足3NF,会建立一个中间表Stu_Course来维护Student和Course之间的关系,在Hibernate中,则使用双向多对多来体现这种结构
数据库脚本
create table stu(id varchar(32) primary key,name varchar(32),cardid varchar(32),age int);
create table course(id varchar(32) primary key,name varchar(32));
create table stu_course(stu_id varchar(32),course_id varchar(32));
insert into stu values("1","tom","200701",11);
insert into stu values("2","tomclus","200702",11);
insert into stu values("3","spark","200703",11);
insert into stu values("4","jerry","200704",11);
insert into course values("1","history");
insert into course values("2","computer");
insert into course values("3","music");
insert into course values("4","encomic");
insert into course values("5","politics");
insert into stu_course values("2","1");
insert into stu_course values("2","2");
insert into stu_course values("2","3");
insert into stu_course values("1","3");
insert into stu_course values("1","4");
insert into stu_course values("3","2");
insert into stu_course values("3","3");
create table course(id varchar(32) primary key,name varchar(32));
create table stu_course(stu_id varchar(32),course_id varchar(32));
insert into stu values("1","tom","200701",11);
insert into stu values("2","tomclus","200702",11);
insert into stu values("3","spark","200703",11);
insert into stu values("4","jerry","200704",11);
insert into course values("1","history");
insert into course values("2","computer");
insert into course values("3","music");
insert into course values("4","encomic");
insert into course values("5","politics");
insert into stu_course values("2","1");
insert into stu_course values("2","2");
insert into stu_course values("2","3");
insert into stu_course values("1","3");
insert into stu_course values("1","4");
insert into stu_course values("3","2");
insert into stu_course values("3","3");
POJO:
package Relation.ManytoMany;
import java.util.Set;
public class Stu ...{
private String id;
private String cardid;
private String name;
private int age;
private Set course;
public Set getCourse() ...{
return course;
}
public void setCourse(Set course) ...{
this.course = course;
}
public String getId() ...{
return id;
}
public void setId(String id) ...{
this.id = id;
}
public String getCardid() ...{
return cardid;
}
public void setCardid(String cardid) ...{
this.cardid = cardid;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
public int getAge() ...{
return age;
}
public void setAge(int age) ...{
this.age = age;
}
}
package Relation.ManytoMany;
import java.util.HashSet;
import java.util.Set;
public class Course ...{
private String id;
private Set students;
private String name;
public String getId() ...{
return id;
}
public void setId(String id) ...{
this.id = id;
}
public Set getStudents() ...{
return students;
}
public void setStudents(Set students) ...{
this.students = students;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
}
import java.util.Set;
public class Stu ...{
private String id;
private String cardid;
private String name;
private int age;
private Set course;
public Set getCourse() ...{
return course;
}
public void setCourse(Set course) ...{
this.course = course;
}
public String getId() ...{
return id;
}
public void setId(String id) ...{
this.id = id;
}
public String getCardid() ...{
return cardid;
}
public void setCardid(String cardid) ...{
this.cardid = cardid;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
public int getAge() ...{
return age;
}
public void setAge(int age) ...{
this.age = age;
}
}
package Relation.ManytoMany;
import java.util.HashSet;
import java.util.Set;
public class Course ...{
private String id;
private Set students;
private String name;
public String getId() ...{
return id;
}
public void setId(String id) ...{
this.id = id;
}
public Set getStudents() ...{
return students;
}
public void setStudents(Set students) ...{
this.students = students;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
}
Hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312&useUnicode=true
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="myeclipse.connection.profile">mysql</property>
<property name="connection.password">1234</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.show_sql">true</property>
<property name="current_session_context_class">thread</property>
<property name="jdbc.batch_size">15</property>
<mapping resource="Relation/ManytoMany/Course.hbm.xml" />
<mapping resource="Relation/ManytoMany/Stu.hbm.xml" />
</session-factory>
</hibernate-configuration>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312&useUnicode=true
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="myeclipse.connection.profile">mysql</property>
<property name="connection.password">1234</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.show_sql">true</property>
<property name="current_session_context_class">thread</property>
<property name="jdbc.batch_size">15</property>
<mapping resource="Relation/ManytoMany/Course.hbm.xml" />
<mapping resource="Relation/ManytoMany/Stu.hbm.xml" />
</session-factory>
</hibernate-configuration>
Stu.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">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="Relation.ManytoMany.Stu" table="stu">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"></generator>
</id>
<property name="cardid" type="string"/>
<property name="name" type="string"/>
<property name="age" type="int"/>
<set name="course" table="stu_course" cascade="save-update">
<key column="stu_id"></key>
<many-to-many class="Relation.ManytoMany.Course"
column="course_id">
</many-to-many>
</set>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="Relation.ManytoMany.Stu" table="stu">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"></generator>
</id>
<property name="cardid" type="string"/>
<property name="name" type="string"/>
<property name="age" type="int"/>
<set name="course" table="stu_course" cascade="save-update">
<key column="stu_id"></key>
<many-to-many class="Relation.ManytoMany.Course"
column="course_id">
</many-to-many>
</set>
</class>
</hibernate-mapping>
Course.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">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="Relation.ManytoMany.Course" table="course" lazy="true">
<id name="id" column="id">
<generator class="uuid.hex"></generator>
</id>
<property name="name" column="name"></property>
<set name="students" inverse="true" table="stu_course" cascade="save-update">
<key column="course_id"></key>
<many-to-many class="Relation.ManytoMany.Stu"
column="stu_id">
</many-to-many>
</set>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="Relation.ManytoMany.Course" table="course" lazy="true">
<id name="id" column="id">
<generator class="uuid.hex"></generator>
</id>
<property name="name" column="name"></property>
<set name="students" inverse="true" table="stu_course" cascade="save-update">
<key column="course_id"></key>
<many-to-many class="Relation.ManytoMany.Stu"
column="stu_id">
</many-to-many>
</set>
</class>
</hibernate-mapping>
测试代码:
package Relation.ManytoMany;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class Test ...{
public static void main(String[] args) ...{
String filePath=System.getProperty("user.dir")+File.separator+"src/Relation/ManytoMany"+File.separator+"hibernate.cfg.xml";
File file=new File(filePath);
System.out.println(filePath);
SessionFactory sessionFactory=new Configuration().configure(file).buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction t=session.beginTransaction();
//查询用户tomclus都选了什么课程
Stu stu=(Stu)session.get(Stu.class, "2");
List list=new ArrayList(stu.getCourse());
for (Iterator iterator = list.iterator(); iterator.hasNext();) ...{
Course course = (Course) iterator.next();
System.out.println(course.getName());
}
//为tomclus添加新的选休课程ecnomic
Stu stu1=(Stu)session.createQuery("from Stu s where s.name='tomclus'").uniqueResult();
Course course=(Course)session.createQuery("from Course c where c.name='encomic'").uniqueResult();
//设置stu1和course的相互关系
stu1.getCourse().add(course);//如果Course.hbm.xml设置inverse="true"使用
//course.getStudents().add(stu1);//如果Stu.hbm.xml设置inverse="true"使用
/**//*
* 如果course.hbm.xml和Stu.hbm.xml都没有设置inverse="true",则同时执行
* 上述两个操作会产生Duplicate entry的异常
*/
//删除tomclus选的computer课程
Stu stu2=(Stu)session.createQuery("from Stu s where s.name='tomclus'").uniqueResult();
Course course1=(Course)session.createQuery("from Course c where c.name='computer'").uniqueResult();
stu2.getCourse().remove(course1);
t.commit();
}
}
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class Test ...{
public static void main(String[] args) ...{
String filePath=System.getProperty("user.dir")+File.separator+"src/Relation/ManytoMany"+File.separator+"hibernate.cfg.xml";
File file=new File(filePath);
System.out.println(filePath);
SessionFactory sessionFactory=new Configuration().configure(file).buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction t=session.beginTransaction();
//查询用户tomclus都选了什么课程
Stu stu=(Stu)session.get(Stu.class, "2");
List list=new ArrayList(stu.getCourse());
for (Iterator iterator = list.iterator(); iterator.hasNext();) ...{
Course course = (Course) iterator.next();
System.out.println(course.getName());
}
//为tomclus添加新的选休课程ecnomic
Stu stu1=(Stu)session.createQuery("from Stu s where s.name='tomclus'").uniqueResult();
Course course=(Course)session.createQuery("from Course c where c.name='encomic'").uniqueResult();
//设置stu1和course的相互关系
stu1.getCourse().add(course);//如果Course.hbm.xml设置inverse="true"使用
//course.getStudents().add(stu1);//如果Stu.hbm.xml设置inverse="true"使用
/**//*
* 如果course.hbm.xml和Stu.hbm.xml都没有设置inverse="true",则同时执行
* 上述两个操作会产生Duplicate entry的异常
*/
//删除tomclus选的computer课程
Stu stu2=(Stu)session.createQuery("from Stu s where s.name='tomclus'").uniqueResult();
Course course1=(Course)session.createQuery("from Course c where c.name='computer'").uniqueResult();
stu2.getCourse().remove(course1);
t.commit();
}
}
一点说明:本例在Course一方设置了inverse="true"
如果双方都不设置,当我们执行
stu1.getCourse().add(course);
course.getStudents().add(stu1);
这两条语句的时候,会引起一个Duplicate entry异常,因为双方都有控制权,所以产生了重复
解决办法有两个:
(1)两个操作语句只使用一个
(2)在一方设置inverse="true",通过另一方保存(被设置inverse="True"的一方即便执行,也不会产生SQL)
- Hibernate关联学习之---多对多关联
- Hibernate学习11 -- 关联映射1 -- 多对一关联
- Hibernate 关联映射 之 多对多 关联(一)
- Hibernate关联映射之--双向多对多关联
- Hibernate关联之 多对多单向关联
- Hibernate关联之 多对多双向关联
- Hibernate 关联映射 之 多对多 关联(一)
- Hibernate关联之 多对一连接表单向关联
- Hibernate学习:单向多对一关联
- Hibernate学习之一对多关联
- Hibernate学习之一对多关联
- hibernate之单向多对一关联
- Hibernate学习15 -- 关联映射5 -- 多对多关联1 -- 多对多关联单向
- Hibernate学习16 -- 关联映射6 -- 多对多关联2 -- 多对多关联双向
- Hibernate关联映射-----多对多关联
- Hibernate关联关系之一对多关联
- Hibernate 多对多关联
- hibernate 多对多关联
- 使用ArcIms的牢骚
- 浅谈优秀的GIS界面设计的诞生
- Junit的概念
- 关于eda
- vi一个文件时如何取消匹配字的颜色显示
- Hibernate关联学习之---多对多关联
- .net数据绑定
- GIS在开发空间型CRM(客户关系管理)中的应用
- ACE版本问题导致编译问题
- server中常用的函数
- 五.上传文件 UploadFile.aspx
- 一位软件工程师的6年总结
- .Net 面试问题汇总
- 面向Internet的三维GIS应用系统