Java 持久化实体时的NullPointerException
我能够使用NamedQuery成功检索对象列表。如果我不对对象进行任何修改,然后尝试合并它(使用我的实体管理器),则不会引发异常。但是,如果我更新该实体中的任何字段并尝试将其合并,则会引发以下异常:Java 持久化实体时的NullPointerException,java,spring,hibernate,Java,Spring,Hibernate,我能够使用NamedQuery成功检索对象列表。如果我不对对象进行任何修改,然后尝试合并它(使用我的实体管理器),则不会引发异常。但是,如果我更新该实体中的任何字段并尝试将其合并,则会引发以下异常: SEVERE: Servlet.service() for servlet [spring-mvc] in context with path [/EuropCar] threw exception [Request processing failed; nested exception is
SEVERE: Servlet.service() for servlet [spring-mvc] in context with path [/EuropCar] threw exception [Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction] with root cause
java.lang.NullPointerException
at org.hibernate.ejb.event.EJB3PostUpdateEventListener.handlePostUpdate(EJB3PostUpdateEventListener.java:71)
at org.hibernate.ejb.event.EJB3PostUpdateEventListener.onPostUpdate(EJB3PostUpdateEventListener.java:67)
at org.hibernate.action.internal.EntityUpdateAction.postUpdate(EntityUpdateAction.java:248)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:205)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:276)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:328)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1233)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:403)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
我已检查以下内容:- 我持久化的实体不是空的。
- entityManager不为null。
这是EJB3PostUpdateEventListener的代码:
70 private void handlePostUpdate(Object entity, EventSource source) {
71 EntityEntry entry = (EntityEntry) source.getPersistenceContext().getEntry( entity );
72 // mimic the preUpdate filter
73 if ( Status.DELETED != entry.getStatus()) {
74 callbackHandler.postUpdate(entity);
75 }
76 }
在此方法中设置一个断点,并查看第71行中的
null
是什么。可能getPersistenceContext()
返回null
我在同一行中遇到了相同的异常。这是因为我使用了不兼容的版本:
hibernate核心:4.2.0.Final
hibernate entitymanager:4.1.9.4最终版本
我已将hibernate core降级为4.1.9.Final,问题消失了。你能告诉我你使用的是哪个hibernate版本的代码吗?我正在使用hibernate版本4.2.0,用
try/catch
块来捕获真正的异常。@ConstantineNovykov,异常是在我尝试持久化时引发的,不是在我尝试检索对象时引发的(但谢谢)。感谢伟大的建议@user714965,persistenceContext不是null。@StevePaul你是说在调试模式下没有得到NullPointerException吗?很抱歉没有以更清晰的方式回复。getPersistenceContext()仍然返回null。您找到任何修复方法了吗?谢谢-这正是解决方案!有人请适当地标记这个!
70 private void handlePostUpdate(Object entity, EventSource source) {
71 EntityEntry entry = (EntityEntry) source.getPersistenceContext().getEntry( entity );
72 // mimic the preUpdate filter
73 if ( Status.DELETED != entry.getStatus()) {
74 callbackHandler.postUpdate(entity);
75 }
76 }