Hibernate inverse的属性介绍

来源:互联网 发布:建筑结构用什么软件 编辑:程序博客网 时间:2024/06/09 17:05

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。

0 0
原创粉丝点击