wangweifeng_gmail 2011-05-10 16:23
浏览 195
已采纳

hibernate表记录更新引发连接表数据被删问题

我的项目中有两个表document、level,它们之间通过连接表实现关联,映射文件如下:

表document

<hibernate-mapping>
    <class name="com.unionmon.knowledge.model.KleDocument" table="KLE_DOCUMENT" schema="UFLOW">
        <id name="kleDocumentId" type="java.lang.Long">
            <column name="KLE_DOCUMENT_ID" precision="22" scale="0" />
            <generator class="native" />
        </id>
        <join table="KLE_DOC_SECRET_UNION" 
            optional="true">
            <key column="KLE_DOCUMENT_ID" unique="true"/>
            <many-to-one name="secretLev"
                column="KLE_SECRET_LEVEL_ID" 
                not-null="true"/>
    </join>
    </class>
</hibernate-mapping>

 表level:

<hibernate-mapping>
    <class name="com.unionmon.knowledge.model.KleSecretLevel" table="KLE_SECRET_LEVEL" schema="UFLOW">
        <id name="kleSecretLevelId" type="java.lang.Long">
            <column name="KLE_SECRET_LEVEL_ID" precision="22" scale="0" />
            <generator class="native"></generator>
        </id>
        <set name="kleDocs" table="KLE_DOC_SECRET_UNION">
            <key column="KLE_SECRET_LEVEL_ID"/>
            <many-to-many column="KLE_DOCUMENT_ID"
                class="com.unionmon.knowledge.model.KleDocument"/>
        </set>
    </class>
</hibernate-mapping>

 表document和level的连接表

<hibernate-mapping package="com.unionmon.knowledge.model">
    <class name="KleDocSecretUnion" table="KLE_DOC_SECRET_UNION" schema="UFLOW">
        <many-to-one name="kleSecretLevel" class="KleSecretLevel" fetch="select">
            <column name="KLE_SECRET_LEVEL_ID" precision="22" scale="0" />
        </many-to-one>
        <many-to-one name="kleDocument" class="KleDocument" fetch="select">
            <column name="KLE_DOCUMENT_ID" precision="22" scale="0" />
        </many-to-one>
    </class>
</hibernate-mapping>

 问题出现在当我更新level表中的某条记录时(比如该记录编号为level_id),发现hibernate有一条语句删除了连接表中所有KLE_SECRET_LEVEL_ID字段值为level_id的记录,我的service层代码如下:

  public String editLevel(KleSecretLevel new_level, long id,long doc_id){
        new_level.setKleDocumentId(doc_id);
        new_level.setKleSecretLevelId(id);
        this.secretDao.save(new_level);
        return "{success: true, msg: '修改成功 '}";
    }

 dao层代码如下:

public T save(T object) {
        return (T) super.getHibernateTemplate().merge(object);
    }

我查阅了hibernate的官方文档和对此错误进行了Google,实在找不到程序不妥的地方,烦请各位解下小弟疑惑。

  • 写回答

1条回答 默认 最新

  • redstarofsleep 2011-05-10 16:29
    关注

    因为你new_level对象里关联的对象为空,Hibernate就会认为它没有关联对象,所以会把关联表里的记录删掉。
    你要保证关联的对象不为空才行,比如先把要更新的记录查查出来,这样new_level对象里所有的字段就都和数据库里的值一样了,然后再修改相关的字段,然后整个对象执行update

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮