论坛首页 Java企业应用论坛

出错:object references an unsaved transient instance

浏览 29014 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-09-12  
环境:
操作系统:windows2000
数据库:mssql2000
JDBC驱动:jtds1.1
Hibernate:3.04
App Server:weblogic8.1sp2
spring1.2
webwork2.6。

描述:
在使用hb2的时候,因为hb2的属性没有lazy功能,所以对于many to one 一般都用了一个id属性,不是类对象属性。

如我的Function类中对Parent的处理:
在hb2.0中
public Long getParentId();
	{ return parentId; }

	public void setParentId(Long parentId);
	{ this.parentId = parentId; }


在hb3.0中

	public Function getParent(); {
		return parent;
	}

	public void setParent(Function parent); {
		this.parent = parent;
	}



那么相应在jsp中
使用hb2设计的PO时,没有问题,因为parent不是类对象属性:
   <ww:hidden name="'function.parentId'"  value="function.parentId"/>


而使用hb3设计的PO时,
   <ww:hidden name="'function.parent.id'"  value="function.parent.id"/>


当function.parent.id==null时,保存从表现层通过webwork参数拦截器后形成的对象function时,系统抛出异常:
object references an unsaved transient instance - save the transient instance before flushing: com.osaplatform.model.Function; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.osaplatform.model.Function

我的分析:
因为ognl中的参数名为"function.parent.id",所以参数拦截器生成了一个对象作为parent属性的值,只是生成的对象的id==null,因此,系统以为parent对象存在,而parent.id=null ,所以抛出此异常。所以,我在保存前加入以下代码:
if (function.getParent();!=null && function.getParent();.getId();==null);
		{
			function.setParent(null);;
		}

这样尽管解决了我的parent问题,但是我发现所有的类对象属性的保存时都发生改问题。比如人员的文化程度:person.culture.id。
   发表时间:2005-09-12  
是这样的了.没有奇怪的.

如果只有父类的ID时,最好的方法是要load一次出来,再进setParent.这样属性是完整的.

当然如果你不是设置关联保存的话,只要有父类ID也可以,因为不设置关联保存的话,父类就不会受到影响.
0 请登录后投票
   发表时间:2005-09-12  
啊,我强调一下,这个情况是发生在function.parent.id==null的情况下,也就是该function对象没有parent!!!

如果有,是不会有问题的。
0 请登录后投票
   发表时间:2005-09-12  
bjwulin 写道
啊,我强调一下,这个情况是发生在function.parent.id==null的情况下,也就是该function对象没有parent!!!

如果有,是不会有问题的。


你应该检查一下是否用了关联保存(即保存子对象,就会保存父对象,或者相反),如果是设置了的话,就会有问题.
0 请登录后投票
   发表时间:2005-09-12  
我的parent的mapping:
<many-to-one
            name="parent"
            class="com.osaplatform.model.Function" not-found="ignore" 
            cascade="none"
            outer-join="auto"
            update="true"
            insert="true"
            column="ParentId"
        />


在保存子对象时,没有对父对象进行保存,而且没有发现时也忽视了。
0 请登录后投票
   发表时间:2005-09-12  
可以试试看:
<ww:if test="function.parent != null">
<ww:hidden name="'function.parent.id'"  > //这里name=value,可以不写value
</ww:if>
<ww:else>
<input type="hidden" name="function.parent"  value="" /> //设置function.parent = null
</ww:else>
0 请登录后投票
   发表时间:2005-09-12  
if function.parent.id != null
put   &lt;ww:hidden name="'function.parent.id'"  value="function.parent.id"/&gt; in your jsp
end if
0 请登录后投票
   发表时间:2005-09-12  
bjwulin 写道
我的parent的mapping:
<many-to-one
            name="parent"
            class="com.osaplatform.model.Function" not-found="ignore" 
            cascade="none"
            outer-join="auto"
            update="true"
            insert="true"
            column="ParentId"
        />


在保存子对象时,没有对父对象进行保存,而且没有发现时也忽视了。


你上面的设置是对的.

HB3.0我不太清楚,但2.1.x如果是这样的话,就不会出现你所说的问题.

看来你也只能用readonly或者其它办法把这个屏蔽掉了.

HB3.0我还没有空去做实现...呵呵.

不过最好你是看一下它打出来的sql是什么....

像HB2.0就是只有一条sql(如果没有设置关联保存,并且没有其它的特殊情况下):

insert into 表 ....标准的SQL

如果还没有到SQL这一级的话,那就有可能是HB3.0的机制变了.
0 请登录后投票
   发表时间:2005-09-12  
首先,我感谢大家对我的问题的参与!!!!

如果说hb2没有这个问题,那么难道是hb3的问题?

目前为止最合适的解决方法是Readonly的。但是我一个界面里面的每个many to one都要写判断是否为空?
0 请登录后投票
   发表时间:2005-09-12  
偶想不通的是为啥需要传递一个function.parent.id的参数?
function都已经被load出来了,它的parent自然能够从数据库获取了,没有必要再传递parent的id过去......
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics