2010-10-13 139 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