先看一下这个词的翻译:
inverse
adj.相反的;逆向的;倒转的
n.相反;倒转;相反的事物
vt.使倒转;使颠倒
乍一看好像跟我们的hibernate里边的inverse属性没有多大的联系…听说是spring里边有个控制反转也是用到这个词,学到再说
好吧我们开始正题
1、inverse是什么?
inverse在hibernate中我的理解是:是否放弃外键维护权…
inverse有两种值:
- true:放弃(即当前一方没有维护权)
- false:不放弃(即当前一方有维护权)[默认]
2、inverse有什么用?
inverse属性的正确设置可以解决双向关联产生多余的SQL语句。
举例说明:
假设我们有两个实体:老师和学生
(我们考虑的情况是:一个老师对应多个学生,一个学生对应一个老师)
** 即:一对多的关系
对应数据库表如下:
- 我们现在有这么一个需求:lucy学生想换一个老师,换成2班的张老师,那么就要进行以下操作。
public void testInverse() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtil.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
//需求:修改lucy的导师为张老师
Teacher teacher = session.get(Teacher.class, 2); //获取张老师的对象
Student student = session.get(Student.class, 10001); //获取lucy的对象
student.setTeacher(teacher); //将张老师设置为自己的导师
teacher.getStuSet().add(student); //将lucy添加到自己的学生集合当中
tx.commit(); //持久化对象不用显式更新(没有意义),提交事务会底层会帮我们更新;
} catch (HibernateException e) {
tx.rollback();
e.printStackTrace();
} finally {
session.close();
sessionFactory.close();
}
}
纳闷将会出现什么问题呢?
在这Markdown编辑器里描述有点不方面,直接画图上传上来了!!!
具体操作:只需要在一的那一方设置inverse属性为true(表示放弃维护权)
<set name="stuSet" cascade="save-update, delete" inverse="true">
再次运行以上代码,就只会出现一次更新外键的SQL(下面那一次不会出现,因为teacher已经放弃外键维护权了)