主题:hibernate级联插入实现多对多
来源:互联网 发布:淘宝盗图处罚规则新规 编辑:程序博客网 时间:2024/05/17 04:30
最近学习hibernate 今天调试一个例子 实现多对多的 插入 采用中间表的形式 进行操作
代码如下:
teacher table
create table `test`.`teacher`(
`tid` int not null auto_increment,
`tname` varchar(40),
primary key (`tid`)
);
create unique index `PRIMARY` on `test`.`teacher`(`tid`);
studnt table
create table `test`.`student`(
`sid` int not null auto_increment,
`sname` varchar(40),
primary key (`sid`)
);
create unique index `PRIMARY` on `test`.`student`(`sid`);
stu_tea_tab table
create table `test`.`stu_tea_tab`(
`tid` int,
`sid` int
);
===========================
teacher.class
package com.test.beans;
import java.util.HashSet;
import java.util.Set;
public class Teacher
{
private Integer tid;
private String tname;
private Set students = new HashSet ( );
public Integer getTid()
{
return tid;
}
public void setTid(Integer tid)
{
this.tid = tid;
}
public String getTname()
{
return tname;
}
public void setTname(String tname)
{
this.tname = tname;
}
public Set getStudents()
{
return students;
}
public void setStudents(Set students)
{
this.students = students;
}
}
teacher 的配置文件:
<?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 Persistence Tools
-->
<hibernate-mapping>
<class name="com.test.beans.Teacher" table="teacher">
<id name="tid" type="java.lang.Integer">
<column name="tid"></column>
<generator class="native"></generator>
</id>
<property name="tname" type="java.lang.String">
<column name="tname" length="40"></column>
</property>
<set name="students" table="stu_tea_tab" inverse="true" cascade="save-update">
<key column="tid"></key>
<many-to-many class="com.test.beans.Student" column="sid"></many-to-many>
</set>
</class>
</hibernate-mapping>
student.class
package com.test.beans;
import java.util.HashSet;
import java.util.Set;
public class Student
{
private Integer sid;
private String sname;
private Set teachers = new HashSet();
public String getSname()
{
return sname;
}
public void setSname(String sname)
{
this.sname = sname;
}
public Integer getSid()
{
return sid;
}
public void setSid(Integer sid)
{
this.sid = sid;
}
public Set getTeachers()
{
return teachers;
}
public void setTeachers(Set teachers)
{
this.teachers = teachers;
}
}
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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.test.beans.Student" table="student" >
<id name="sid" type="java.lang.Integer">
<column name="sid"></column>
<generator class="native"></generator>
</id>
<property name="sname" type="java.lang.String">
<column name="sname" length="40"></column>
</property>
<set name="teachers"
table="stu_tea_tab"
cascade="save-update"
inverse="false"
>
<key column="sid"></key>
<many-to-many class="com.test.beans.Teacher" column="tid"></many-to-many>
</set>
</class>
</hibernate-mapping>
hibernatesessionfactory.java
package com.test.hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class HibernateSessionFactory {
private static String CONFIG_FILE_LOCATION = "/com/test/hibernate/hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
static {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err
.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
private HibernateSessionFactory() {
}
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}
return session;
}
public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err
.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
public static org.hibernate.SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void setConfigFile(String configFile) {
HibernateSessionFactory.configFile = configFile;
sessionFactory = null;
}
public static Configuration getConfiguration() {
return configuration;
}
}
studentdao.java
package com.test.daos;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.test.beans.Student;
import com.test.hibernate.HibernateSessionFactory;
public class StudentDao
{
public void addStudent(Student student)
{
Session session = HibernateSessionFactory.getSession ( );
Transaction tr = session.beginTransaction ( );
session.save ( student );
tr.commit();
HibernateSessionFactory.closeSession ( );
}
}
测试类:
package com.test.test;
import com.test.beans.Student;
import com.test.beans.Teacher;
import com.test.daos.StudentDao;
import com.test.daos.TeacherDao;
public class Test
{
public static void main(String args[])
{
Student stu1 = new Student();
stu1.setSname ( "stu1" );
Student stu2 = new Student();
stu2.setSname ( "stu2" );
Teacher tea1 = new Teacher();
tea1.setTname ( "tea1" );
Teacher tea2 = new Teacher();
tea2.setTname ( "tea2" );
stu1.getTeachers ( ).add ( tea1 );
stu1.getTeachers ( ).add ( tea2 );
stu2.getTeachers ( ).add ( tea1 );
stu2.getTeachers ( ).add ( tea2 );
StudentDao studentDao = new StudentDao();
studentDao.addStudent ( stu1 );
studentDao.addStudent ( stu2 );
}
}
说明:在这里我们采用 学生 握有主动权去选择老师。
我个人觉得才用中间表的形式实现多对多比较好,降低了表和表之间的耦合度。
- 主题:hibernate级联插入实现多对多
- Hibernate多对一级联
- hibernate 多对一级联删除;
- Hibernate级联查询(多对一)
- Hibernate 下实现数据的级联插入
- hibernate 某个对象自身多对多 级联删除
- hibernate中hbm的级联操作(多对多)
- Hibernate中的一对多&多对一&关联&级联
- hibernate框架多对多-级联保存(十八)
- 心得6-hibernate级联之多对多单双向剖析
- hibernate多对一映射配置级联删除
- Hibernate单向多对一级联删除引发的问题
- Hibernate多对一、双向关系、控制反转、级联配置
- hibernate多对多关联数据插入
- hibernate annotation many-to-one cascade 没用(Hibernate 注解 多对一 级联 没用)
- hibernate一对一,一对多,多对一,多对多关系映射与级联
- Hibernate----@Annotation----一对多----级联
- Hibernate----@Annotation----一对多----级联
- How to run dbus and obex-data-server on ARM-xScale
- javascript 时间对象的操作
- j2me 图片缩略图
- 资源编辑器中的长度单位
- 10个最佳视听网站
- 主题:hibernate级联插入实现多对多
- A List itemRenderer using States and Transitions
- C#中队列集合的用法,配合线程
- SOA治理:企业视图
- ASP.NET服务端自动化操作Excel的问题汇总
- 并行乱谈
- [Windows 7] 初探 Windows 7 M3 Build6801 - 从当前系统升级
- 别跌倒在自己的优势上
- [转载]不可多得的Javascript(AJAX)开发工具 - Aptana