Hibernate inverse的属性介绍

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值