精华帖 (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。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-09-12
是这样的了.没有奇怪的.
如果只有父类的ID时,最好的方法是要load一次出来,再进setParent.这样属性是完整的. 当然如果你不是设置关联保存的话,只要有父类ID也可以,因为不设置关联保存的话,父类就不会受到影响. |
|
返回顶楼 | |
发表时间:2005-09-12
啊,我强调一下,这个情况是发生在function.parent.id==null的情况下,也就是该function对象没有parent!!!
如果有,是不会有问题的。 |
|
返回顶楼 | |
发表时间:2005-09-12
bjwulin 写道 啊,我强调一下,这个情况是发生在function.parent.id==null的情况下,也就是该function对象没有parent!!!
如果有,是不会有问题的。 你应该检查一下是否用了关联保存(即保存子对象,就会保存父对象,或者相反),如果是设置了的话,就会有问题. |
|
返回顶楼 | |
发表时间: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" /> 在保存子对象时,没有对父对象进行保存,而且没有发现时也忽视了。 |
|
返回顶楼 | |
发表时间: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> |
|
返回顶楼 | |
发表时间:2005-09-12
if function.parent.id != null
put <ww:hidden name="'function.parent.id'" value="function.parent.id"/> in your jsp end if |
|
返回顶楼 | |
发表时间: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的机制变了. |
|
返回顶楼 | |
发表时间:2005-09-12
首先,我感谢大家对我的问题的参与!!!!
如果说hb2没有这个问题,那么难道是hb3的问题? 目前为止最合适的解决方法是Readonly的。但是我一个界面里面的每个many to one都要写判断是否为空? |
|
返回顶楼 | |
发表时间:2005-09-12
偶想不通的是为啥需要传递一个function.parent.id的参数?
function都已经被load出来了,它的parent自然能够从数据库获取了,没有必要再传递parent的id过去...... |
|
返回顶楼 | |