【发布时间】: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 吗?另外,您能否添加一些有关
EcoFormFill和User之间关联的详细信息(它是双向的吗?)。作为旁注,我不建议使用HibernateTemplate,但这是另一回事(参见blog.springsource.com/2007/06/26/…)。 -
感谢您的回复 Pascal,我刚刚更新了我的问题,请参见上文。
-
好的。所以这是一个“假”的多对一?你也有从
User到EcoFormFill的关联吗?当使用get()而不是load()时,你会得到相同的结果吗? -
我不知道这是一个“假”...而且我没有从用户到 EcoFormFill 的关联。我确实尝试了 get() 和 load() 都没有成功
-
好吧,当我查看您的代码时,它看起来像一个一对一的关联(您没有将用户添加到集合中,是吗?),这就是为什么我称它为假多对一。无论如何,这并不能回答问题,我也不知道如何重现问题。
标签: java mysql hibernate spring foreign-keys