我最近更改了代码以引用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);
  }

它抱怨说它不能将“用户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()中使用前面的方法。
下面是我的表单和无法填充的用户id之间的关联:
<id name="id">
  <generator class="native"/>
</id>
...
...
<many-to-one column="user_id" name="user" not-null="false"/>

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

最佳答案

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>

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

09-04 06:45