`
可怜狼
  • 浏览: 32426 次
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate级联插入实现多对多

阅读更多

最近学习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做的省市县三级级联,很具体,包你一看就会,其中包含ajax局部刷新;省市县所有数据台湾省的数据不全面,其他都配好了,只需要你整合一下即可运行。

    Spring+Hibernate 一对一映射级联增删改查小例子

    Spring+Hibernate 框架整合写的一对一映射级联增删改查小例子,有SQL文件和使用说明,代码简洁易懂.

    Hibernate+中文文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    hibernate3.2中文文档(chm格式)

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    HibernateAPI中文版.chm

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    最全Hibernate 参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 ...

    Hibernate中文详细学习文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    Hibernate 中文 html 帮助文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    hibernate 体系结构与配置 参考文档(html)

    一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    Hibernate教程

    8.4.1. 一对多(one to many) / 多对一(many to one) 8.4.2. 一对一(one to one) 8.5. 使用连接表的双向关联(Bidirectional associations with join tables) 8.5.1. 一对多(one to many) /多对一( many ...

    Hibernate注解

    * 9.increnment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 * 例:@GeneratedValue(generator = ...

    Hibernate3+中文参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 ...

    hibernate3.04中文文档.chm

    8.5.1. 一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多(many to many) 9. 组件(Component)映射 9.1. 依赖对象(Dependent objects) 9.2. 在集合中出现的依赖...

    hibernate 框架详解

    一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多(many to many) 9. 组件(Component)映射 9.1. 依赖对象(Dependent objects) 9.2. 在集合中出现的依赖对象 ...

    Hibernate参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    低清版 大型门户网站是这样炼成的.pdf

    4.3.9 映射多对多双向关联关系 252 4.3.10 映射组成关系 256 4.3.11 映射继承关系 260 4.3.12 hibernate的集合映射 266 4.4 小结 270 第5章 hibernate 3持久化技术实践与性能优化 271 5.1 操作持久化对象的...

    二十一道面试程序.txt

    9. 用ajax技术实现一个级联菜单功能。 10.写出插入法进行排序代码。 11.编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",...

Global site tag (gtag.js) - Google Analytics