<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.zttc.itat.model">
<class name="TeacherCourse" table="t_teacher_course">
<id name="id">
<generator class="native"/>
</id>
<property name="ach"/>
<many-to-one name="teacher" column="tid"/>
<many-to-one name="course" column="cid"/>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.zttc.itat.model">
<class name="Teacher" table="t_teacher">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="tcs" lazy="extra" inverse="true">
<key column="tid"/>
<one-to-many class="TeacherCourse"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.zttc.itat.model">
<class name="Course" table="t_course">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="tcs" lazy="extra" inverse="true">
<key column="cid"/>
<one-to-many class="TeacherCourse"/>
</set>
</class>
</hibernate-mapping>
package org.zttc.itat.test;
import org.hibernate.Session;
import org.junit.Test;
import org.zttc.itat.model.Admin;
import org.zttc.itat.model.Classroom;
import org.zttc.itat.model.Course;
import org.zttc.itat.model.Role;
import org.zttc.itat.model.Student;
import org.zttc.itat.model.Teacher;
import org.zttc.itat.model.TeacherCourse;
import org.zttc.itat.util.HibernateUtil;
public class TestManyToMany2 {
@Test
public void testAdd01() {
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();
Teacher t1 = new Teacher();
t1.setName("老张");
session.save(t1);
Teacher t2 = new Teacher();
t2.setName("老刘");
session.save(t2);
Course c1 = new Course();
c1.setName("数据结构");
session.save(c1);
Course c2 = new Course();
c2.setName("计算机组成原理");
session.save(c2);
TeacherCourse tc1 = new TeacherCourse();
tc1.setAch(87);
tc1.setTeacher(t1);
tc1.setCourse(c1);
session.save(tc1);
tc1 = new TeacherCourse();
tc1.setAch(66);
tc1.setTeacher(t1);
tc1.setCourse(c2);
session.save(tc1);
tc1 = new TeacherCourse();
tc1.setAch(190);
tc1.setTeacher(t2);
tc1.setCourse(c1);
session.save(tc1);
tc1 = new TeacherCourse();
tc1.setAch(20);
tc1.setTeacher(t2);
tc1.setCourse(c2);
session.save(tc1);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
if(session!=null) session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}
}
@Test
public void testLoad01() {
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, 1);
//load的时候由于延迟加载,会根据不同的情况取相应的关联对象,所以会发出大量的sql
/**
* 总体来说:最佳实践就是,一般不使用双向关联,特别不建议使用一的这一方的关联
* 因为从一的这一端取关联对象很有可能会涉及到分页操作,所以基本不会使用
* 在设计的时候不是特殊情况不要使用双向关联。
*/
System.out.println(t.getName());
for(TeacherCourse tc:t.getTcs()) {
System.out.println(tc.getCourse().getName()+":"+tc.getAch());
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
if(session!=null) session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}
}
}
************************************************************************************************************************************************************************************************
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.zttc.itat.model">
<class name="Admin" table="t_admin">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_admin_role" lazy="extra">
<key column="aid"/>
<many-to-many class="Role" column="rid"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.zttc.itat.model">
<class name="Person" table="t_person">
<id name="id">
<!-- 表示不会自动生成,而是需要由用户来指定 -->
<!-- <generator class="assigned"/> -->
<!-- 会自动生成一个字符串,此时组件必须为String类型 -->
<generator class="native"/>
</id>
<property name="name"/>
<!-- name表示属性的名称,property-ref表示由对端来维护关系-->
<one-to-one name="idCard" property-ref="person"/>
</class>
</hibernate-mapping>
package org.zttc.itat.test;
import org.hibernate.Session;
import org.junit.Test;
import org.zttc.itat.model.Admin;
import org.zttc.itat.model.Classroom;
import org.zttc.itat.model.Role;
import org.zttc.itat.model.Student;
import org.zttc.itat.util.HibernateUtil;
public class TestManyToMany {
/*
* 使用Many2Many不论在哪一方来维护关系都比较的麻烦,而且很多时候关联表中需要加入其他的属性
* 所以在开发中,经常使用两个一对多来替代多对多
*/
@Test
public void testAdd01() {
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();
Admin a1 = new Admin();
a1.setName("张三");
session.save(a1);
Admin a2 = new Admin();
a2.setName("李四");
session.save(a2);
Role r1= new Role();
r1.setName("超级管理员");
r1.add(a1);
session.save(r1);
Role r2 = new Role();
r2.setName("财务管理人员");
r2.add(a1);
r2.add(a2);
session.save(r2);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
if(session!=null) session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}
}
@Test
public void testLoad01() {
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();
Admin a = (Admin)session.load(Admin.class, 1);
System.out.println(a.getName());
for(Role r:a.getRoles()) {
System.out.println(r.getName());
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
if(session!=null) session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}
}
}