首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hibernate的级联保存中遇到的一个有关问题

2012-10-24 
hibernate的级联保存中遇到的一个问题以下是我级联保存的做法:双向一对多1. 在一的一端设置级联(cascade

hibernate的级联保存中遇到的一个问题
    以下是我级联保存的做法:
    双向一对多
   1. 在一的一端设置级联(cascade="save-update")
   2. 不要让一的一端来维护关系(set中的设置inverse="true")
   3. 保存时一的一端添加多的一端(set.add()),多的一端设置一的一端(setXX())
   4. 保存一的一端

    双向多对多
   1. 在A端设置级联(cascade="save-update")以及关系维护(inverse="false")
   2. 保存时A端添加B端(set.add())
   3. 保存A端

    这两种都存在一个问题:若其中的一端(比如一对多里多的一端)已存在,则会产生update语句来修改该端的表,即使这个表都没有被修改过。我的猜测是由于有设置cascade,所以会有级联的操作,而且级联操作调用的是saveOrUpdate,那么表既然存在所以是update了。这个问题比较讨厌,不知道能不能不要产生update语句。
   
   相关的测试是:

    TestEnterprise(企业)----TestUser(人员),他们之间是一个一对多的关系

    其中TestEnterprise的相关配置
   

    <set name="testUsers" inverse="true" cascade="save-update">        <key>             <column name="EID" precision="22" scale="0" />         </key>         <one-to-many />    </set>    


    TestUser的相关配置
    
    <many-to-one name="testEnterprise" fetch="select">        <column name="EID" precision="22" scale="0" />    </many-to-one>    


    测试代码
    
     TestEnterprise enterprise = new TestEnterprise();     enterprise.setName("xxx");     TestUser user = dao.getById(6l, TestUser.class);     enterprise.getTestUsers().add(user);     user.setTestEnterprise(enterprise);     dao.save(enterprise);    


    控制台显示
   
select testuser0_.ID as ID1_0_, testuser0_.EID as EID1_0_, testuser0_.NAME as NAME1_0_, testuser0_.PASSWORD as PASSWORD1_0_, testuser0_.STATUS as STATUS1_0_ from DBO.TEST_USER testuser0_ where testuser0_.ID=?select max(ID) from TEST_ENTERPRISEinsert into DBO.TEST_ENTERPRISE (NAME, ID) values (?, ?)update DBO.TEST_USER set EID=?, NAME=?, PASSWORD=?, STATUS=? where ID=?    


    就是最后多了一个update语句,如果我把 cascade="save-update"去掉的话就不会有了,但是这样显然不行。另外这个问题和保存一的一端还是保存多的一端都没什么关系,无论保存的是哪端都有产生这样的问题。现在请教各位了。

1 楼 wucc1986 2009-08-08   不产生update语句的话怎么设置关联关系呢。
讨厌的是关联关系已经存在的时候,你去修改了企业表的name属性,这个时候也会发一条update语句,这条确实是多余的。

2 楼 wucc1986 2009-08-08   user.setTestEnterprise(enterprise); 
这句一定要写的吗?

热点排行