inverse是hibernate双向关系中的概念。inverse的作用就是指定由哪一方来维护之间的关联关系。
示例
Stu表
public class Stu implements java.io.Serializable {
private Integer sid;
private Stuclass stuclass;
private String sname;
}
<hibernate-mapping>
<class name="entity.Stu" table="STU" schema="GC">
<id name="sid" type="java.lang.Integer">
<column name="SID" precision="5" scale="0" />
<generator class="assigned" />
</id>
<many-to-one name="stuclass" class="entity.Stuclass" fetch="select">
<column name="CLASSID" precision="5" scale="0" />
</many-to-one>
<property name="sname" type="java.lang.String">
<column name="SNAME" length="20" />
</property>
</class>
</hibernate-mapping>
StuClass表
public class Stuclass implements java.io.Serializable {
private Integer cid;
private String cname;
private Set stus = new HashSet(0);
}
<hibernate-mapping>
<class name="entity.Stuclass" table="STUCLASS" schema="GC">
<id name="cid" type="java.lang.Integer">
<column name="CID" precision="5" scale="0" />
</id>
<property name="cname" type="java.lang.String">
<column name="CNAME" length="20" />
</property>
<set name="stus" inverse="false" cascade="save-update">
<key>
<column name="CLASSID" precision="5" scale="0" />
</key>
<one-to-many class="entity.Stu" />
</set>
</class>
</hibernate-mapping>
inverse属性只在一的一方的set标签中有此属性,在多的一方many-to-one标签中无此属性,默认值为inverse=”false”,即由自己一方来维护双方的关系。
举例说明:
当新增一个StuClass对象时,级联新增当前对象里包含的Stu对象
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Stu stu = new Stu(1,"测试");
Stuclass sc= new Stuclass(10,"一年级");
sc.getStus().add(stu);
session.save(sc);
tx.commit();
hibernate会发出4条sql语句
Hibernate: select stu_.SID, stu_.CLASSID as CLASSID1_, stu_.SNAME as SNAME1_ from GC.STU stu_ where stu_.SID=?
Hibernate: insert into GC.STUCLASS (CNAME, CID) values (?, ?)
Hibernate: insert into GC.STU (CLASSID, SNAME, SID) values (?, ?, ?)
Hibernate: update GC.STU set CLASSID=? where SID=?
第一条是查询新增的Stu对象是否存在
第二条是插入新增的StuClass信息
第三条是插入新增的Stu的信息
因为我们设置了inverse=false,代表由StuClass来维护双方关系,所以新增StuClass对象是,又发出了第四条更新语句来维护双方的关系。
如果把inverse设置为true,代表由另一方来维护。
那么执行代码:
Hibernate: select stu_.SID, stu_.CLASSID as CLASSID1_, stu_.SNAME as SNAME1_ from GC.STU stu_ where stu_.SID=?
Hibernate: insert into GC.STUCLASS (CNAME, CID) values (?, ?)
Hibernate: insert into GC.STU (CLASSID, SNAME, SID) values (?, ?, ?)
只会发出3条语句,那么那条更新的SQL语句的作用是什么呢?
看看数据库:
Stu表里classid未插入数据!由于我们保存的StuClass对象里的Stu对象并没有classid的数据,所以新增时为空,而设置了inverse=false的时候,主动方维护了两表的关系,把新增后的Stu对象的空的classid的值更新成了关联表的ID。