我的项目中有两个表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,实在找不到程序不妥的地方,烦请各位解下小弟疑惑。