在struts2框架下保存对象:object references an unsaved transient instance异常解决办法

在struts2中,保存某个对象a,而这个对象中又包含其它对象b(外键关联),这个时候,如果b为空值,保存的时候就会报错:object references an unsaved transient instance...

记得这个问题之前遇到过好多次,但是解决办法始终没记下来,今天又遇到这个错误,现将解决办法记录如下:

很多时候,我们在页面中会这样定义一个表单元素:

<input type="hidden" name="a.b.id" value=""/>

如果value为空,那么我们期望在保存的时候,将a的属性b设置为null,不管是我们手动设置b为null,还是默认操作,都会报错。错误的原因是:虽然我们手动设置a.b为null,但是在我们提交表单到action的时候,struts2的框架仍然会为我们初始化一个b对象,即a.b这个对象不为null,但是b对象里面的所有属性都是null,也包括id,那么在我们保存的时候,hibernate会探测到有一个瞬时对象没有保存,所以就会报错。

之前尝试过将数据库中的外键约束去掉,但是仍然不行,后来在网上搜索了很多办法,貌似都不能解决。

最后,将页面中的表单元素改写如下:

<input type="hidden" name="bId" value=""/>

其实,我们希望得到的是b的id值,那么我们可以简单的在strus2的action中定义一个变量专门用来保存b.id,这样如果表单值为空,那么bId也将为空,我们可以通过判断该值,来手工的设置a的b属性值,这里的设置,最后是根据bId通过service查询出对象来,然后设置给a,或者设置a.b为null,这样操作以后,struts2就不会默认为a.b创建对象了,也就不会发生上面的错误了。

 

猜你喜欢

转载自aswang.iteye.com/blog/1019622