问题描述
我的项目中有两个表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,实在找不到程序不妥的地方,烦请各位解下小弟疑惑。
解决方案
因为你new_level对象里关联的对象为空,Hibernate就会认为它没有关联对象,所以会把关联表里的记录删掉。你要保证关联的对象不为空才行,比如先把要更新的记录查查出来,这样new_level对象里所有的字段就都和数据库里的值一样了,然后再修改相关的字段,然后整个对象执行update