Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠';s session.update(obj)方法使子对象暂时(在父/子关系中)_Java_Hibernate - Fatal编程技术网

Java 冬眠';s session.update(obj)方法使子对象暂时(在父/子关系中)

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

我有一个文件夹的父/子关系,如下所示:

文件夹可以有0-1个父文件夹。 文件夹可以有0-n个子文件夹(子文件夹)

使用Hibernate,我在这些文件夹上调用
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>