首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

Hibernate级联保存,父表为空,先存子表,保存提示外键为null的异常如何解决

2013-01-23 
Hibernate级联保存,父表为空,先存子表,保存提示外键为null的错误怎么解决?本帖最后由 dragon08 于 2013-01

Hibernate级联保存,父表为空,先存子表,保存提示外键为null的错误怎么解决?
本帖最后由 dragon08 于 2013-01-17 12:55:04 编辑 两张表:父表people,子表picture
people的映射文件如下,省略字段的描述


<hibernate-mapping package="com.myproject.entity">
<class name="People" table="PEOPLE">
<meta attribute="sync-DAO">false</meta>
<cache usage="read-write"/>
<id name="id" type="java.lang.Long" column="PEOPLE_ID">
<generator class="sequence">
<param name="sequence">S_PEOPLE</param>
</generator>
</id>
<set name="pictures" inverse="true">
<key column="PEOPLE_ID"></key>
<one-to-many class="Picture"/>
</set>
</class>
</hibernate-mapping>


picture的映射文件如下,省略字段的描述

<hibernate-mapping package="com.myproject.entity">
<class name="Picture" table="PICTURE">
<meta attribute="sync-DAO">false</meta>
<cache usage="read-write"/>
<id name="id" type="java.lang.Long" column="PICTURE_ID">
<generator class="sequence">
<param name="sequence">S_PICTURE</param>
</generator>
</id>
<many-to-one name="people" column="PEOPLE_ID" class="People" not-null="false"></many-to-one>
</class>
</hibernate-mapping>


我的应用要求是在添加people人物信息的界面,弹出另外一个页面添加人物的picture信息,只有这个页面操作完关闭后,才能返回people添加界面继续操作。
这里在保存picture的时候people还没有生成,people_id就为空了。想法是先保存picture信息,people_id留空,后面保存people信息的时候再更新picture的people_id字段。
但在保存picture的时候报错,保存代码如下:

bean.setTitle(title);
bean.setAddTime(now());
save(bean);


错误提示:

2013-01-17 12:16 INFO  c.j.d.a.f.PictureAction - savePicture()
2013-01-17 12:16 WARN  c.o.x.i.ExceptionMappingInterceptor - null
java.lang.NullPointerException
at com.myproject.common.hibernate3.BaseManagerImpl.save(BaseManagerImpl.java:125) [BaseManagerImpl.class:na]
at com.myproject.manager.impl.PictureMngImpl.savePicture(PictureMngImpl.java:40) [PictureMngImpl.class:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [na:1.5.0_11]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [na:1.5.0_11]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [na:1.5.0_11]
at java.lang.reflect.Method.invoke(Unknown Source) [na:1.5.0_11]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) [spring-aop-2.5.6.jar:2.5.6]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) [spring-aop-2.5.6.jar:2.5.6]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) [spring-aop-2.5.6.jar:2.5.6]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) [spring-tx-2.5.6.jar:2.5.6]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) [spring-aop-2.5.6.jar:2.5.6]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) [spring-aop-2.5.6.jar:2.5.6]
at $Proxy31.savePicture(Unknown Source) [na:na]
at com.myproject.action.PictureAction.savePicture(PictureAction.java:53) [PictureAction.class:na]


at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [na:1.5.0_11]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [na:1.5.0_11]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [na:1.5.0_11]
at java.lang.reflect.Method.invoke(Unknown Source) [na:1.5.0_11]
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249) [xwork-2.1.2.jar:na]
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) [struts-core-2.1.6.jar:na]
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) [xwork-2.1.2.jar:na]
at com.myproject.common.struts2.interceptor.UrlInterceptor.doIntercept(UrlInterceptor.java:91) [UrlInterceptor.class:na]
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) [xwork-2.1.2.jar:na]
at com.myproject.core.web.CookieIdentityInterceptor.doIntercept(CookieIdentityInterceptor.java:67) [CookieIdentityInterceptor.class:na]
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) [xwork-2.1.2.jar:na]
at com.myproject.common.struts2.interceptor.DomainNameInterceptor.doIntercept(DomainNameInterceptor.java:24) [DomainNameInterceptor.class:na]
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) [xwork-2.1.2.jar:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) [xwork-2.1.2.jar:na]
at com.myproject.common.struts2.interceptor.ProcessingStartInterceptor.intercept(ProcessingStartInterceptor.java:32) [ProcessingStartInterceptor.class:na]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) [xwork-2.1.2.jar:na]
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) [struts-core-2.1.6.jar:na]
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:532) [struts-core-2.1.6.jar:na]


at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395) [struts-core-2.1.6.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) [catalina.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:na]
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) [spring-orm-2.5.6.jar:2.5.6]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) [spring-web-2.5.6.jar:2.5.6]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) [catalina.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:na]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) [catalina.jar:na]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) [catalina.jar:na]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) [catalina.jar:na]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [catalina.jar:na]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [catalina.jar:na]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) [catalina.jar:na]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) [tomcat-coyote.jar:na]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) [tomcat-coyote.jar:na]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) [tomcat-coyote.jar:na]
at java.lang.Thread.run(Unknown Source) [na:1.5.0_11]




想问一下大家如何处理啊?我是想先保存子表picture,再保存父表people,然后更新子表的外键字段。 hibernate cascade inverse
[解决办法]
干嘛要这么麻烦呢!!!
你在添加人物的picture信息的时候、可以保存你选择的数据的编号!如你选择了三条、就包这三条信息的主键编号保存起来!
然后赋值给父页面、在跟父页面的信息一起提交到后台!!!
保存people表的时候在把你选择的三条信息查询出来、然后添加到people的Set集合中、然后保存people对象就行了!


[解决办法]
你主表和从表有one-to-mang和many-to-one这个关系,
从表中PEOPLE_ID"不能为空,只保存从表当然报不能为空错误。
而且保存从表,没有主表,数据逻辑就不对。
[解决办法]
你只是想在页面上显示一下,你可以将从表信息保存在页面中,或者session中,
最后保存时,从页面中读取出来和主表一起保存到数据库。

热点排行