1. Inverse设置关系维护方。当inverse=”false”时,谁管理关系谁维护。如果都管理了,那么都维护。当关系由多的一端来维护时,效率较高。当关系由一的一端来维护时。会多执行update语句。
2.Inverse=”true”时,关系由另一端管理。不管一的一端是否指明关系,一的一端都不会去维护关系。都由多的一端负责。建议inverse=”true”.
3.Grade和Student类:
public class Grade {
private int id;
private String name;
private Set<Student> students = new HashSet<Student>(0);
/*省略get/set*/
public class Student {
private int id;
private String name;
private int age;
private Grade grade;
/*省略get/set*/
4.配置文件
Grade.hbm.xml【令inverse=false,之后在步骤7再测试inverse=true】
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.siggy.pojo">
<class name="Grade">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<!-- set是 Grade中的集合属性 name属性名称 -->
<!-- inverse设置由谁来管理关系 如果为false则双方都可以管理关系
如果为true则关系由另一方来管理,且必须由多的一方来管理,默认
inverse=false-->
<set name="students" inverse="false">
<!-- key表示外键 column外键列名-->
<key column="grade_id"></key>
<!-- one-to-many 一对多 类Grade 中 students 所表示类型 -->
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.siggy.pojo">
<class name="Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<property name="age"/>
<!--
cascade 级联:让操作级联到子实体
save-update:保存和更新多的一端数据时,一的一端的数据可以一起保存和更新
none:不级联
delete:删除级联-不能在多的一端使用
all:表示所有操作都级联
-->
<many-to-one name="grade" class="Grade" column="grade_id"
></many-to-one>
</class>
</hibernate-mapping>
5.0 测试代码【当inverse=false时的测试结果】
package cn.siggy.test;
import java.sql.SQLException;
import javax.sql.rowset.serial.SerialException;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
import cn.siggy.pojo.Grade;
import cn.siggy.pojo.Student;
import cn.siggy.util.HibernateUtil;
public class HibernateTest {
@Test
public void testCreateDB(){
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
//第一个参数 是否生成ddl脚本 第二个参数 是否执行到数据库中
se.create(true, true);
}
@Test
public void testSave() throws HibernateException, SerialException, SQLException{
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Grade grade = new Grade();
grade.setName("基础");
// /*方式一:双方都维护关系*/
// Student stu = new Student();
// stu.setName("张三疯");
// stu.setAge(22);
// stu.setGrade(grade);
// Student stu1 = new Student();
// stu1.setName("老王");
// stu1.setAge(23);
// stu1.setGrade(grade);
//
// grade.getStudents().add(stu);
// grade.getStudents().add(stu1);
// session.save(grade);
// session.save(stu);
// session.save(stu1);
/*方式二:一的一端维护关系*/
Student stu = new Student();
stu.setName("张三疯");
stu.setAge(22);
Student stu1 = new Student();
stu1.setName("老王");
stu1.setAge(23);
grade.getStudents().add(stu);
grade.getStudents().add(stu1);
session.save(grade);
session.save(stu);
session.save(stu1);
// /*方式三:由多的一方维护关系*/
// Student stu = new Student();
// stu.setName("张三疯");
// stu.setAge(22);
// stu.setGrade(grade);
// Student stu1 = new Student();
// stu1.setName("老王");
// stu1.setAge(23);
// stu1.setGrade(grade);
//
// session.save(grade);
// session.save(stu);
// session.save(stu1);
tx.commit();
}catch (HibernateException e) {
if(tx!=null)
tx.rollback();
e.printStackTrace();
throw e;
}finally{
HibernateUtil.closeSession();
}
}
@Test
public void testGet(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
// Grade grade = (Grade)session.get(Grade.class, 1);
// session.delete(grade);
Student stu = (Student) session.get(Student.class, 1);
session.delete(stu);
tx.commit();
}catch (HibernateException e) {
if(tx!=null)
tx.rollback();
e.printStackTrace();
//throw e;
}finally{
HibernateUtil.closeSession();
}
}
}
6.测试结果:
1.方式一:双方式都维护关系
控制台信息:
数据库表信息:
2.方式二:由一的一端维护关系【结果和方式一一样】
3.方式三:由多的一端维护关系
控制台信息:
数据库表信息:
7.当inverse=true时,测试结果如下:【关系由另一方维护,且必须由多的一方维护】
1.方式一:
2.方式二:【多的一方没有维护,故student表的grade_id=null】
3.方式三: