您的位置:首页 > 其它

hibernate多对多关联

2016-07-06 19:48 337 查看
多对多表的搭建




java类中



多对多
1、关系操作
1、多对多,谁操作效率都一样
2、解除关系
把第三张表的一行数据删除掉
3、建立关系
把第三张表的数据增加一行记录
4、变更关系
先删除后增加
2、级联操作
都是对象针对集合的操作
例子

工具类
public class HibernateUtils {
public static SessionFactory sessionFactory;
public static String url;
@Before
public void init(){
Configuration configuration = new Configuration();
if(url==null){
configuration.configure();
}else{
configuration.configure(url);
}
sessionFactory = configuration.buildSessionFactory();
}

student映射文件
<?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">

<hibernate-mapping>
<class name="cn.itcast.many.Student">
<id name="sid" length="5">
<generator class="increment"></generator>
</id>
<property name="sname" length="20"></property>
<property name="description" length="100"></property>
<set name="coursess" table="student_course" cascade="save-update">
<key>
<column name="sid"></column>
</key>
<many-to-many class="cn.itcast.many.Courses" column="cid"></many-to-many>
</set>

</class>
</hibernate-mapping>
courses映射文件
<?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">

<hibernate-mapping>
<class name="cn.itcast.many.Courses">
<id name="cid" length="5">
<generator class="increment"></generator>
</id>
<property name="cname" length="20"></property>
<property name="description" length="100"></property>
<set name="students" table="student_course" cascade="save-update">
<key>
<column name="cid"></column>
</key>
<many-to-many class="cn.itcast.many.Student" column="sid"></many-to-many>
</set>

</class>
</hibernate-mapping>

测试
@Test
public void testCreateTable(){
}
@Test
public void testSaveStudent_Cascade_Courses_Save(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setSname("班长");
student.setDescription("牛人");
Courses Courses = new Courses();
Courses.setCname("生理卫生");
Courses.setDescription("很好");
Set<Courses> Coursess = new HashSet<Courses>();
Coursess.add(Courses);
student.setCoursess(Coursess);
session.save(student);
transaction.commit();
session.close();
}
/**
* 已经存在一个课程,新建一个学生,建立课程和学生之间的关系
*    从课程角度出发
*/
@Test
public void testUpdateCourses_Cascade_Student_Save_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Courses Courses = (Courses)session.get(Courses.class, 1L);
Student student = new Student();
student.setSname("班迷");
student.setDescription("班丝:班长的钢丝");
Courses.getStudents().add(student);
session.save(student);
transaction.commit();
session.close();
}
/**
* 已经存在一个课程,新建一个学生,建立课程和学生之间的关系
*   从学生角度出发
*/
@Test
public void testSaveStudent_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Courses Courses = (Courses)session.get(Courses.class, 1L);
Student student = new Student();
student.setSname("班迷");
student.setDescription("班丝:班长的钢丝");
Set<Courses> Coursess = new HashSet<Courses>();
Coursess.add(Courses);
student.setCoursess(Coursess);
session.save(student);
transaction.commit();
session.close();
}
/**
* 已经存在一个课程,已经存在一个学生,建立关联
*/
@Test
public void testR(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Courses Courses = (Courses)session.get(Courses.class, 1L);
Student student = (Student)session.get(Student.class, 2L);
student.getCoursess().add(Courses);
transaction.commit();
session.close();
}
/**
* 把学生3,4加入到课程1中
*/
@Test
public void testR_Some(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Courses Courses = (Courses)session.get(Courses.class, 1L);
Student student = (Student)session.get(Student.class, 3L);
Student student2 = (Student)session.get(Student.class, 4L);
//student.getCoursess().add(Courses);
//student2.getCoursess().add(Courses);
Courses.getStudents().add(student2);
Courses.getStudents().add(student);
transaction.commit();
session.close();
}
/**
* 把一个学生加入到一些课程中
*/
@Test
public void testR_Some_2(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = (Student)session.get(Student.class, 3L);
List<Courses> CoursesList = session.createQuery("from Courses where cid in(1,2,3)").list();
student.getCoursess().addAll(CoursesList);
transaction.commit();
session.close();
}
/**
* 把学生从一个课程转移到另外一个课程
*/
@Test
public void testTransform(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = (Student) session.get(Student.class, 3L);
Courses Courses1 = (Courses)session.get(Courses.class, 1L);
Courses Courses3 = (Courses)session.get(Courses.class, 3L);
student.getCoursess().remove(Courses1);
student.getCoursess().add(Courses3);
transaction.commit();
session.close();
}

关联删除的错误
1、根据映射文件可以得出classes与student有关联
2、在客户端,students是由classes产生的,代表了关联关系
3、所以在删除student的时候,必须通过classes解除关系
4、解除关系以后才能进行删除
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate