主要用于说明关联关系(外键)维护权。
取值:
1.true
交出外键的维护权,由另一方维护。
2.false
不交出外键的维护权。
注意:
双方不能同时设置inverse=“true”,否则外键关系将得不到维护。
多对一和一对多关系外键的维护权问题:
hibernate默认由多方来维护外键,一方应该交出外键的维护权,目的是不发送update语句去更新外键,减少数据库开销,增加性能。
这就要求我们,以后进行增删改的时候尽量由多方来操作数据库。
如果业务一定要求由一方维护外键关系,当一方插入一条记录,同时需要插件多条多方记录,势必增加数据库开销。
inverse和cascade有联系吗?
没有任何关系!
cascade级联增删改,不会维护外键关系,外键应该都是null值。
inverse来负责外键的维护。
public class Clazz {
private Integer id;
private String cname;
private Set<Student> stus;
}
public class Student {
private Integer id;
private String sname;
private Set<Teacher> teaches;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="inverse.model.Clazz" table="CLAZZ">
<id name="id" column="ID">
<generator class="increment"></generator>
</id>
<property name="cname" column="CNAME"></property>
<set name="stus" cascade="all" inverse="true">
<key column="CID"></key>
<one-to-many class="inverse.model.Student"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="inverse.model.Student" table="STUDENT">
<id name="id" column="ID">
<generator class="increment"></generator>
</id>
<property name="sname" column="SNAME"></property>
<many-to-one name="clazz" class="inverse.model.Clazz" column="CID" cascade="all" ></many-to-one>
</class>
</hibernate-mapping>
public class ClazzDao {
public void insert(Clazz clazz) {
Session session = HibernateUtil.findSession();
session.save(clazz);
}
}
public class ClazzService {
private ClazzDao dao = new ClazzDao();
public void save(Clazz clazz) {
Session session = HibernateUtil.findSession();
Transaction tx = session.beginTransaction();
try {
dao.insert(clazz);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
}
}
public class ClazzTest {
ClazzService ser = new ClazzService();
@Test
public void testSaveClazz(){
Clazz clazz = new Clazz();
clazz.setCname("高三三班");
Set<Student> set = new HashSet<>();
Student s1 = new Student();
s1.setSname("张三2");
Student s2 = new Student();
s2.setSname("李四2");
set.add(s1);
set.add(s2);
clazz.setStus(set);
ser.save(clazz);
}
}