当前位置:编程学习 > JAVA >>

删除时为何报“attempt to create delete event with null entity”

   本人我的结构是:struts + hibernate+spring,后台数据库用的是mysql, 在发布界面的数据列表中删除记录时,第一次删除正常,也能流转回到列表页面,记录显示正常,刚刚删除的记录已经看不到了,可是再在这个界面继续删除记录,就报错了:

java.lang.IllegalArgumentException: attempt to create delete event with null entity
org.hibernate.event.DeleteEvent.<init>(DeleteEvent.java:47)
org.hibernate.impl.SessionImpl.delete(SessionImpl.java:772)
org.springframework.orm.hibernate3.HibernateTemplate$25.doInHibernate(HibernateTemplate.java:848)
org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:842)
org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:838)
sm.dao.hibernate.UserDaoImpl.delete(UserDaoImpl.java:53)
sm.serviceImpl.UserServiceImpl.deleteUserById(UserServiceImpl.java:30)
sm.action.user.DelUserAction.execute(DelUserAction.java:37)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)

_____________________________________________________________________________________________

网上查的资料显示,有可能是转发到显示页面过程中,保留了session。
但我的struts-xml配置如下:
    <action name="delUser" class="delUser">
           <result name="success" type="redirectAction">listUser</result>
    </action>

是用的redirectAction类型,为什么还是报这样的错误呢?另外,我是用的HibernateTemplate作为的Dao的操作接口。
--------------------编程问答-------------------- 会是hibernate的问题吗? --------------------编程问答-------------------- 我又想了一下,会不会是spring中关于事务的配置有问题呢?! --------------------编程问答-------------------- redirectAction改成chain试试 --------------------编程问答-------------------- 很明显 你删除了 一条不存在的记录  这种错误 可能是你ID传值有误  还有可能就是你重复提交 删了一次 第二次 接着删 肯定报错了  

顺便打个广告  群之初 打打字 聊聊天 若为技术故 两者皆可抛 ssh,s2sh 93763261 --------------------编程问答-------------------- 试了chain还是不行 --------------------编程问答-------------------- 删除后HibernateTemplate.flush()一下看看行不行 --------------------编程问答-------------------- 问题解决了,在删除的时候需要做个判断,当删除对象不为空时,才执行删除操作!

public void deleteUserById(Integer id){
if(userDaoImpl.get(id) != null){
userDaoImpl.delete(userDaoImpl.get(id));
} --------------------编程问答--------------------
引用 7 楼 raoxiru 的回复:
问题解决了,在删除的时候需要做个判断,当删除对象不为空时,才执行删除操作!

public void deleteUserById(Integer id){
if(userDaoImpl.get(id) != null){
userDaoImpl.delete(userDaoImpl.get(id));
}


自己犯了简单的错误,以后小心点吧 --------------------编程问答-------------------- 我原来以为hibernateTemplate封装了自动判断删除对象是否存在~~~ --------------------编程问答-------------------- 是的,自己忘记判断id是否存在了,谢谢各位的帮助! --------------------编程问答-------------------- 我今天做分页的时候碰到这个问题了。
分页的页面执行删除,

删除的时候:后台显示SQL语句,删除正常。
。但是页面跳转是跳转到查询所有的。
因此显示的依然是原先的数据。
也就是说页面的数据没有删除。(实际上是已经删除了的。)

后来删除的action 删除成功后跳转到 分页的action 再执行一次就正常了。! --------------------编程问答-------------------- 我判断了还是不行啊。大家帮我看看!
public String deleteUser() {
System.out.println("开始删除----------1");
System.out.println("获取主页面传过来的id======="+id);
Session session=HibernateSessionFactory.getSessionFactory().openSession();
        session.beginTransaction();
        System.out.println("开始删除----------2");       
        int i = Integer.valueOf(id).intValue();
        System.out.println("i的值为----------"+i);
        session.get(Login.class,i);
        System.out.println("开始删除----------3");
        if(login.get(id) != null){
         session.delete(login.get(id));
       // session.delete(login,i);
        System.out.println("删除成功----------0");
        session.getTransaction().commit();
session.close();
        return "success";
}

出现错误:
开始删除----------3
2012-1-12 11:11:06 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException: attempt to create delete event with null entity
at org.hibernate.event.DeleteEvent.<init>(DeleteEvent.java:24)
at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:739)
at dao.LoginAction.deleteUser(LoginAction.java:99)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
at org.apache.struts2 --------------------编程问答-------------------- 上面帖子改了一下。报信的错误  session.get(Login.class,i);
        System.out.println("开始删除----------3");
        if(login!= null){
         session.delete(login);}

       // session.delete(login,i);
        System.out.println("删除成功----------0");
        session.getTransaction().commit();
session.close();

没有报错。我的数据并没有删除啊。怎么回事?
控制台信息:
开始删除----------2
i的值为----------11
Hibernate: select login0_.Id as Id0_0_, login0_.Name as Name0_0_, login0_.password as password0_0_ from test.login login0_ where login0_.Id=?
开始删除----------3
删除成功----------0
Hibernate: select login0_.Id as Id0_, login0_.Name as Name0_, login0_.password as password0_ from test.login login0_
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,