Hibernate的session.updateobj方法使子对象成为临时对象在父/子关系中

问题描述

|| 我有一个文件夹的父子关系,如下所示: 一个文件夹可以有0-1个父文件夹。 一个文件夹可以有0-n个子文件夹(子文件夹)。 使用休眠模式,我在这文件夹上调用了“ 0”。 当这样的文件夹没有子文件夹时,一切正常。 但是,当文件夹包含子文件夹时,ѭ0将使子文件夹处于暂态状态(子文件夹的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>
更新:这是我用来更新文件夹的Java代码
public class DatabaseController{

    private SessionFactory  sessionFactory  = null;

    public void updateFolder(Folder folder){
        Session session = null;
        Transaction transaction = null;
        try {
            session = getSession();
            transaction = session.beginTransaction();
            session.update(folder);
            transaction.commit();
        } catch (Exception e) {
            rollback(transaction);
            closeSession();
        } finally {
            closeSession();
        }
    }

    /*
     * Returns the Hibernate session
     */
    private Session getSession() {
        if (_session == null) {
            _session = getSessionFactory().getCurrentSession();
        }
        if (_session.isopen() == false) {
            _session = getSessionFactory().openSession();
        }
        return _session;
    }

    /**
     * Returns the session factory
     * 
     * @return The session factory
     */
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
    

解决方法

        没错 您的集合定义中有cascade = \“ none \”。 http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/html_single/#objectstate-transitive 您需要设置级联= \“保存更新\”。     ,        我找到了解决问题的办法。更改我的休眠映射文件中的以下行可解决此问题:
    <set name=\"childFolders\" table=\"FOLDERS\" inverse=\"true\" cascade=\"none\">
        <key column=\"PARENT_FOLDER_ID\"></key>
        <one-to-many class=\"test.Folder\" />
    </set>
我认为,除去键上的
not-null=\"false\"
可以解决问题。     ,        您的代码: 更新2
 <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\" /> // **this should point to child table not itself**
  </set>
你给错关系船 我的代码:
<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>