【问题标题】:Hibernate getHibernateTemplate issue when saving object inside another object将对象保存在另一个对象中时出现休眠 getHibernateTemplate 问题
【发布时间】:2010-07-25 22:37:36
【问题描述】:

我最近更改了我的代码以引用 getHibernateTemplate(),现在我的表单似乎无法正确保存,代码如下:


  public void saveForm(EcoFormFill form, int userId)
  throws RemoteException
  {
    User tmpUser = (User)getHibernateTemplate().load(User.class, new Integer(userId));
    form.setUser(tmpUser);
    getHibernateTemplate().saveOrUpdate(form);
  }

它抱怨它不能将'user_id'设置为空(我的数据库中的一个约束)......以前我使用这种方法:


  public void saveForm(EcoFormFill form, int userId)
  throws RemoteException
  {
    Session ses = getHibernateTemplate().getSessionFactory().openSession();
    try
    {
      User tmpUser = (User) ses.load(User.class, new Integer(userId));
      form.setUser(tmpUser);
      ses.saveOrUpdate(form);
    }
    catch (Exception e)
    {
      log.error(e.getMessage(), e);
      throw new RemoteException(e.getMessage());
    }
    finally
    {
      ses.flush();
      ses.close();
    }
  }

而且这种方法效果很好,但它让我对单元测试感到悲痛,所以我需要使用之前的方法和 getHibernateTemplate()。

这是我的表单和未能填充的 user_id 之间的关联:

<id name="id">
  <generator class="native"/>
</id>
...
...
<many-to-one column="user_id" name="user" not-null="false"/>

在这两种情况下生成的 SQL 语句是相同的,只是 user_id 没有正确插入到参数中。

【问题讨论】:

  • 很奇怪。你能显示在这两种情况下执行的 SQL 吗?另外,您能否添加一些有关EcoFormFillUser 之间关联的详细信息(它是双向的吗?)。作为旁注,我不建议使用HibernateTemplate,但这是另一回事(参见blog.springsource.com/2007/06/26/…)。
  • 感谢您的回复 Pascal,我刚刚更新了我的问题,请参见上文。
  • 好的。所以这是一个“假”的多对一?你也有从UserEcoFormFill 的关联吗?当使用get() 而不是load() 时,你会得到相同的结果吗?
  • 我不知道这是一个“假”...而且我没有从用户到 EcoFormFill 的关联。我确实尝试了 get() 和 load() 都没有成功
  • 好吧,当我查看您的代码时,它看起来像一个一对一的关联(您没有将用户添加到集合中,是吗?),这就是为什么我称它为假多对一。无论如何,这并不能回答问题,我也不知道如何重现问题。

标签: java mysql hibernate spring foreign-keys


【解决方案1】:

Trevor 是你的应用上下文好像是这样的

</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>


看看上面,这部分代表了您的应用程序上下文中所需的最小值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 2015-04-27
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多