Hibenate/JPA 多对多关系

1、数据库结构:

2、实体代码:

teacher类:

import java.util.HashSet;

import java.util.Set;

 

import javax.persistence.CascadeType;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.JoinTable;

import javax.persistence.ManyToMany;

import javax.persistence.Table;

 

@Entity

@Table(name = "t_teacher")

public class Teacher {

    @Id

    Integer teacherId;

    String teacherName;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)

    //CascadeType参考 这里不建议将CascadeType类型设置为ALL

    @JoinTable(name = "t_teacher_student", joinColumns = { @JoinColumn(name = "teacherid") }, inverseJoinColumns = { @JoinColumn(name = "studentid") })

    //@JoinTable参考

   Set<Student> students = new HashSet<Student>(0);

 

    public Integer getTeacherId() {

       return teacherId;

    }

 

    public void setTeacherId(Integer teacherId) {

       this.teacherId = teacherId;

    }

 

    public String getTeacherName() {

       return teacherName;

    }

 

    public void setTeacherName(String teacherName) {

       this.teacherName = teacherName;

    }

 

    public Set<Student> getStudents() {

       return students;

    }

 

    public void setStudents(Set<Student> students) {

       this.students = students;

    }

 

    public void addStudent(Student student  ) {

       this.students.add(student);

    }

}

 

 Student类:

import java.util.HashSet;

import java.util.Set;

import javax.persistence.CascadeType;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.Id;

import javax.persistence.ManyToMany;

import javax.persistence.Table;

 

@Entity

@Table(name = "t_student")

public class Student {

    @Id

    Integer studentId;

    String studentName;

    @ManyToMany(mappedBy = "students", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)

    Set<Teacher> teachers = new HashSet<Teacher>(0);

 

    public Integer getStudentId() {

       return studentId;

    }

 

    public void setStudentId(Integer studentId) {

       this.studentId = studentId;

    }

 

    public String getStudentName() {

       return studentName;

    }

 

    public void setStudentName(String studentName) {

       this.studentName = studentName;

    }

 

    public Set<Teacher> getTeachers() {

       return teachers;

    }

 

    public void setTeachers(Set<Teacher> teachers) {

       this.teachers = teachers;

    }

 

    public void addTeachers(Teacher teacher) {

       this.teachers.add(teacher);

    }

}

 

测试代码:

 

import org.hibernate.Session;

import org.hibernate.Transaction;

 

import commons.utils.HibernateUtil;

 

public class Test {

    public static void main(String[] args) {

       Session session = HibernateUtil.getCurrentSession();

       session.getTransaction().begin();

       Student s1, s2;

       s1 = new Student();

       s1.setStudentId(new Integer(1));

       s1.setStudentName("studentname1");

       s2 = new Student();

       s2.setStudentId(new Integer(2));

       s2.setStudentName("studentname2");

      

       Teacher t1, t2;

       t1 = new Teacher();

       t1.setTeacherId(new Integer(1));

       t1.setTeacherName("teacherName1");

       t2 = new Teacher();

       t2.setTeacherId(new Integer(2));

       t2.setTeacherName("teacherName2");

   

       t1.addStudent(s1);

       t1.addStudent(s2);

       t2.addStudent(s1);

       t2.addStudent(s2);

      

       session.save(s1);

       session.save(s2);

       session.save(t1);

       session.save(t2);

       session.getTransaction().commit();

       session.close();

    }

}

 

配置文件:

<?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">

<hibernate-configuration>

    <session-factory>

       <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

       <property name="hibernate.connection.password">MY</property>

       <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:oracle</property>

       <property name="hibernate.connection.username">MY</property>

       <property name="hibernate.default_schema">MY</property>

       <property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>

 

       <property name="hibernate.hbm2ddl.auto">create-drop</property>

        <property name="hibernate.show_sql">true</property>

              <mapping class="ss.Student" />

       <mapping class="ss.Teacher" />

    </session-factory>

</hibernate-configuration>


HibernateUtil 辅助类:

 

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.AnnotationConfiguration;

import org.hibernate.cfg.Configuration;

 

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {

       try {

           // Create the SessionFactory from hibernate.cfg.xml

           sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

       } catch (Throwable ex) {

           // Make sure you log the exception, as it might be swallowed

           System.err.println("初始化SessionFactory失败!" + ex);

           throw new ExceptionInInitializerError(ex);

       }

    }

    public static final ThreadLocal session = new ThreadLocal();

 

    public static Session getCurrentSession() throws HibernateException {

       Session s = (Session) session.get();

       // 当原Session为空或已关闭时,打开一个新的Session

       if (s == null || !s.isOpen()) {

           s = sessionFactory.openSession();

           session.set(s);

       }

       return s;

    }

 

    public static void closeSession() throws HibernateException {

       Session s = (Session) session.get();

       session.set(null);

       if (s != null) {

           s.close();

       }

    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值