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

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和DWR来实现一个高效、用户友好的省市县三级级联选择功能。开发过程中涉及了ORM、MVC架构、数据库操作以及前端交互等多个方面,是学习和实践Web开发技能的好实例。

    Hibernate级联操作.docx

    在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...

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

    本示例将探讨如何在Spring与Hibernate整合的环境中实现一对一(OneToOne)映射,并进行级联操作,包括增、删、改、查。下面我们将详细讲解这一主题。 首先,一对一映射是数据库设计中的一种关系,表示两个表中的一...

    hibernate(一对多,多对一映射)操作

    压缩包中的"**Hibernater**"文件可能包含了实现这些操作的Java源代码和数据库脚本,读者可以参考其中的实现细节,进一步理解Hibernate的一对多和多对一映射以及如何在实际项目中运用。通过实践,开发者可以更好地...

    Java中单表和多表级联的增删改查

    - 当两个或更多表之间存在关联时,例如一对多、多对一或多对多关系,级联操作会涉及到一个表的操作导致另一个表的相关数据也发生变化。例如,删除一个用户可能需要同时删除与之相关的所有订单。 - Hibernate等ORM...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    在Java的持久化框架Hibernate中,一对多(Many-to-One)和多对一(One-to-Many)的关系映射是数据库关系模型中的常见关联类型。本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和...

    hibernate一对多实例

    描述中的链接指向了一篇由“fangguanhong”在iteye博客上发表的文章,虽然具体内容没有提供,但我们可以根据标题推测该文章可能详细讲解了一个具体的Hibernate一对多关系的实现步骤和示例代码。 在Java的Hibernate...

    Hibernate插入数据

    以上就是关于“Hibernate插入数据”的核心知识点,希望对你在学习过程中有所帮助。在共享和交流知识的过程中,我们可以共同进步,不断提升IT技能。同时,为了保护个人作品,使用水印是一种有效的手段,但也要确保不...

    Hibernate多对多关联关系demo

    在Hibernate中,多对多关联关系通过`&lt;many-to-many&gt;`标签来实现。你需要在两个实体的映射文件中分别定义对方的引用。例如,假设我们有两个实体,一个是“学生”(Student),另一个是“课程”(Course)。在Student...

    hibernate多对一映射(XML)版

    当你调用`session.save()`或`session.update()`时,Hibernate会自动处理多对一的关系,包括插入或更新相关的外键值。 4. **级联操作**: - `cascade`属性允许你控制当操作一个实体时,是否也影响到关联的实体。...

    hibernate学习入门一对多实体映射源码

    在Hibernate中,一对多关系的映射通常通过XML配置文件(hibernate.cfg.xml)或注解实现。这里我们主要讨论注解方式: 1. 在父实体类上,我们需要使用`@OneToMany`注解来定义一对多关系。这个注解包含以下属性: - ...

    hibernate双边多对多关系

    在数据库中,多对多关系通常通过一个中间表来实现,这个中间表包含了两个实体的主键,作为其外键。例如,考虑学生和课程的关系,一个学生可以选修多门课程,一门课程也可以被多个学生选修,这就形成了双边多对多关系...

    Hibernate_一对多增删改查数据

    《Hibernate一对多关系的数据操作详解》 在Java的持久化框架Hibernate中,关系映射是其核心特性之一,尤其是一对多(One-to-Many)关系的处理,它广泛存在于现实世界的业务场景中,如一个用户可以有多个订单,一个...

    用Struts+hibernate+SQLServer2000写的级联下拉框程序

    总结起来,这个项目展示了如何结合Struts的控制层、Hibernate的数据持久化层以及SQLServer2000的数据库服务,实现一个动态的、基于用户选择的级联下拉框功能。对于学习Java Web开发和实践MVC架构的人来说,这是一个...

    Hibernate 单表实现树结构

    标题中的“Hibernate 单表实现树结构”是指在Java开发中,使用Hibernate框架来处理具有层级关系的数据,例如组织架构、目录树等。在数据库中,这种数据通常使用单表自连接的方式存储,即一张表中某个字段指向自身,...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

    hibernate多对多

    在配置文件中,我们将使用`&lt;set&gt;`或`&lt;bag&gt;`元素来表示多对多关系,其中`inverse`属性用于指定维护端,而`cascade`属性控制级联操作。 ```xml &lt;!-- Student.hbm.xml --&gt; ``` ```xml &lt;!-- Course.hbm.xml --&gt; ...

    Hibernate一对多实例

    本教程将详细讲解如何在Hibernate中实现一对多的关系实例,涵盖一对多的插入和查询操作。 首先,我们要理解一对多关系的基本概念。在数据库设计中,一对多关系意味着一个实体可以与多个其他实体相关联。例如,一个...

    三级联动的实例+struts2+hibernate3

    在IT行业中,"三级联动"通常指的是在一个应用中,三个或更多下拉列表框之间存在联动关系,即一个下拉框的选择会影响到下一个下拉框的数据加载。这种技术常见于地域选择、产品分类等场景,提供了良好的用户体验。在这...

    hibernate多对多关系代码

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,允许一个实体与另一个实体有多个关联实例。在实际应用中,比如用户可以加入多个角色,角色也可以被多个用户拥有,这就是典型...

Global site tag (gtag.js) - Google Analytics