先看一下这个词的翻译:
inverse
adj.相反的;逆向的;倒转的
n.相反;倒转;相反的事物
vt.使倒转;使颠倒

乍一看好像跟我们的hibernate里边的inverse属性没有多大的联系…听说是spring里边有个控制反转也是用到这个词,学到再说

好吧我们开始正题


1、inverse是什么?

inverse在hibernate中我的理解是:是否放弃外键维护权…
inverse有两种值:

  • true:放弃(即当前一方没有维护权)
  • false:不放弃(即当前一方有维护权)[默认]

2、inverse有什么用?

inverse属性的正确设置可以解决双向关联产生多余的SQL语句。

举例说明:
假设我们有两个实体:老师和学生
(我们考虑的情况是:一个老师对应多个学生,一个学生对应一个老师)
** 即:一对多的关系
对应数据库表如下:
谈谈Hibernate中inverse的属性

  • 我们现在有这么一个需求: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编辑器里描述有点不方面,直接画图上传上来了!!!

谈谈Hibernate中inverse的属性

具体操作:只需要在一的那一方设置inverse属性为true(表示放弃维护权)

<set name="stuSet" cascade="save-update, delete" inverse="true">

再次运行以上代码,就只会出现一次更新外键的SQL(下面那一次不会出现,因为teacher已经放弃外键维护权了)

相关文章: