Java 冬眠';s session.update(obj)方法使子对象暂时(在父/子关系中)
我有一个文件夹的父/子关系,如下所示: 文件夹可以有0-1个父文件夹。 文件夹可以有0-n个子文件夹(子文件夹) 使用Hibernate,我在这些文件夹上调用Java 冬眠';s session.update(obj)方法使子对象暂时(在父/子关系中),java,hibernate,Java,Hibernate,我有一个文件夹的父/子关系,如下所示: 文件夹可以有0-1个父文件夹。 文件夹可以有0-n个子文件夹(子文件夹) 使用Hibernate,我在这些文件夹上调用session.update(folder) 当这样的文件夹没有子文件夹时,一切正常 但是,当文件夹包含子文件夹时,session.update(文件夹)将使子文件夹变为临时文件夹(子文件夹的id从4更改为0!) 这怎么可能 这是我的映射文件: <?xml version="1.0"?> <!DOCTYPE hiberna
session.update(folder)
当这样的文件夹没有子文件夹时,一切正常
但是,当文件夹包含子文件夹时,session.update(文件夹)
将使子文件夹变为临时文件夹(子文件夹的id从4更改为0!)
这怎么可能
这是我的映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="test.Folder" table="FOLDERS">
<id name="id" type="long" access="field">
<column name="FOLDER_ID" />
<generator class="native" />
</id>
<set name="childFolders" table="FOLDERS" lazy="false" inverse="true" cascade="none">
<key column="PARENT_FOLDER_ID" not-null="false"></key>
<one-to-many class="test.Folder" />
</set>
<many-to-one name="parentFolder" column="PARENT_FOLDER_ID" />
<property name="name" column="FOLDER_NAME" />
<property name="rootFolder" column="IS_ROOT_FOLDER" type="boolean" not-null="true" />
<property name="path" column="FOLDER_PATH" />
<property name="type" column="FOLDER_TYPE" />
<property name="fullPath" column="FULL_PATH" unique="true" not-null="true" />
</class>
</hibernate-mapping>
没错
您的集合定义中有cascade=“none”
您需要设置cascade=“save update”。您的代码:
更新2
//**这应该指向子表,而不是它本身**
你给错了关系
我的代码:
<set cascade="all, delete-orphan" name="childTable" order-by="param" inverse="true">
<key>
<column name="p_id"/>
</key>
<one-to-many class="com.a.data.ChildTable"/>
</set>
我找到了这个问题的解决方案。更改hibernate映射文件中的以下行修复了该问题:
<set name="childFolders" table="FOLDERS" inverse="true" cascade="none">
<key column="PARENT_FOLDER_ID"></key>
<one-to-many class="test.Folder" />
</set>
我认为,删除键的
notnull=“false”
就可以解决这个问题。请添加用于更新实体的java代码。除了cascade=“xxx”属性之外,您的代码和我的代码有什么区别?顺便说一句,更改级联设置没有效果。对不起,我看不到。你的代码中的一对多似乎和我的一样,只是类名不同。我认为你应该先学习hibernate的父/子关系。我已经通读了。还是看不出你的代码和我的代码有什么不同。介意详细解释一下你指的是什么吗?不,我以前就有这套。如果我这样做,Hibernate首先对父文件夹进行更新,然后将id=0设置为子文件夹。然后,它为子文件夹执行插入(而不是更新),因为id=0,这将导致JDBC异常(重复条目),因为子文件夹已经存在于数据库中。
<set cascade="all, delete-orphan" name="childTable" order-by="param" inverse="true">
<key>
<column name="p_id"/>
</key>
<one-to-many class="com.a.data.ChildTable"/>
</set>
<set name="childFolders" table="FOLDERS" inverse="true" cascade="none">
<key column="PARENT_FOLDER_ID"></key>
<one-to-many class="test.Folder" />
</set>