Hibernate级联保存,父表为空,先存子表,保存提示外键为null的错误怎么解决?

时间:2022-02-24 17:12:02
两张表:父表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,然后更新子表的外键字段。

5 个解决方案

#1


干嘛要这么麻烦呢!!!
你在添加人物的picture信息的时候、可以保存你选择的数据的编号!如你选择了三条、就包这三条信息的主键编号保存起来!
然后赋值给父页面、在跟父页面的信息一起提交到后台!!!
保存people表的时候在把你选择的三条信息查询出来、然后添加到people的Set集合中、然后保存people对象就行了!

#2


你主表和从表有one-to-mang和many-to-one这个关系,
从表中PEOPLE_ID"不能为空,只保存从表当然报不能为空错误。
而且保存从表,没有主表,数据逻辑就不对。

#3


你只是想在页面上显示一下,你可以将从表信息保存在页面中,或者session中,
最后保存时,从页面中读取出来和主表一起保存到数据库。

#4


原来我搞错了,以为picture表没有涉及到dao的操作,就没有写dao的类。原来这个null值错误是dao发出的。
去掉父表中的关联

<set name="pictures" inverse="true">             <key column="PEOPLE_ID"></key>             <one-to-many class="Picture"/>         </set> 


这样就能正常保存子表picture了,people_id字段当然是空的。

#5


引用 4 楼 dragon08 的回复:
原来我搞错了,以为picture表没有涉及到dao的操作,就没有写dao的类。原来这个null值错误是dao发出的。
去掉父表中的关联
Java code?1<set name="pictures" inverse="true">             <key column="PEOPLE_ID"></key>             <one-to-many c……


你这个样子做了过后、还得注意一下、在保存主表信息失败的时候、记得删除原来添加的子表信息!
 否则数据库就存储了没有用的脏数据

#1


干嘛要这么麻烦呢!!!
你在添加人物的picture信息的时候、可以保存你选择的数据的编号!如你选择了三条、就包这三条信息的主键编号保存起来!
然后赋值给父页面、在跟父页面的信息一起提交到后台!!!
保存people表的时候在把你选择的三条信息查询出来、然后添加到people的Set集合中、然后保存people对象就行了!

#2


你主表和从表有one-to-mang和many-to-one这个关系,
从表中PEOPLE_ID"不能为空,只保存从表当然报不能为空错误。
而且保存从表,没有主表,数据逻辑就不对。

#3


你只是想在页面上显示一下,你可以将从表信息保存在页面中,或者session中,
最后保存时,从页面中读取出来和主表一起保存到数据库。

#4


原来我搞错了,以为picture表没有涉及到dao的操作,就没有写dao的类。原来这个null值错误是dao发出的。
去掉父表中的关联

<set name="pictures" inverse="true">             <key column="PEOPLE_ID"></key>             <one-to-many class="Picture"/>         </set> 


这样就能正常保存子表picture了,people_id字段当然是空的。

#5


引用 4 楼 dragon08 的回复:
原来我搞错了,以为picture表没有涉及到dao的操作,就没有写dao的类。原来这个null值错误是dao发出的。
去掉父表中的关联
Java code?1<set name="pictures" inverse="true">             <key column="PEOPLE_ID"></key>             <one-to-many c……


你这个样子做了过后、还得注意一下、在保存主表信息失败的时候、记得删除原来添加的子表信息!
 否则数据库就存储了没有用的脏数据