2010-10-13 284 views
2

我有one-to-many父對象和子對象之間的關係。父對象使用存儲多個子對象的java.util.List。我遇到的問題是在向父節點中的List添加一個或多個子對象後更新父對象。我正在使用saveOrUpdate方法來保存或更新父級。如果我正在保存父對象的新實例,但它工作正常,但在保存後,我嘗試將子對象添加到父對象List中,然後嘗試對父對象調用saveOrUpdate,但沒有任何子對象條目( s)被持久化到數據庫中。我只想要一些指針。 注意:我沒有使用註釋。
Parent.hbm.xml的一個片段,它定義了一個一對多的單向關係:休眠一對多單向映射表

<list name="children" cascade="all"> 
    <key column="parent_id"/> 
    <index column="idx"/> 
    <one-to-many class="Child"/> 
    </list> 

回答

2

我只是想重現這個例子,它爲我的工作確定。

這裏是我的映射:

<hibernate-mapping package="com.example.domain"> 
    <class name="com.example.domain.Parent" table="PARENT"> 

     <id name="id" column="parent_id" access="field"> 
      <generator class="increment" /> 
     </id> 
     <property name="name" column="parent_name" access="field" /> 

     <list name="children" access="field" cascade="all"> 
      <key column="parent_id" not-null="true" /> 
      <index column="idx" /> 
      <one-to-many class="Child" /> 
     </list> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping package="com.example.domain"> 
    <class name="com.example.domain.Child" table="CHILD"> 
     <id name="id" column="child_id" access="field"> 
      <generator class="increment" /> 
     </id> 
     <property name="name" column="child_name" access="field" /> 
    </class> 
</hibernate-mapping> 

我加not-null="true"父映射。

您是否嘗試在您的hibernate配置中設置show_sql以查看生成的SQL?

+0

謝謝羅馬。我按照你的建議嘗試過。但是,我得到一個異常:「org.hibernate.LazyInitializationException:未能懶惰地初始化一個角色集合:Parent.children,沒有會議或會話已關閉」。從數據庫加載父級後,JUnit測試在parent.getChildren上失敗。 – walters 2010-10-14 09:03:23

+0

是的,這發生在分離的實體上。根據需求(例如是否必須始終加載子進程),可以熱切加載它們(要執行此操作,可以在列表中設置lazy =「false」)。您可以在Hibernate網站上閱讀更多內容:http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-fetching-lazy。另外,請考慮「在視圖中打開會話」模式。 – Roman 2010-10-14 09:50:28

+0

另外,這個SO線程有關於這個問題的更多信息:http://stackoverflow.com/questions/345705/hibernate-lazyinitializationexception-could-not-initialize-proxy – Roman 2010-10-14 10:03:57