休眠 java.lang.NullPointerException
Posted
技术标签:
【中文标题】休眠 java.lang.NullPointerException【英文标题】:Hibernate java.lang.NullPointerException 【发布时间】:2017-02-06 03:04:41 【问题描述】:我已将 Set 嵌套到我的实体中。这是我的代码:
MyClassA:
@Entity
@Table(name = "aaa")
public class MyClassA
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
@NotEmpty
@Size(min = 3, max = 255)
@Column(name = "name", nullable = false)
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<MyClassB> mycollection = new HashSet<MyClassB>();
public MyClassA()
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public Set<MyClassB> getMyClassB()
return mycollection;
public void setMyClassB(Set<MyClassB> mycollection)
this.mycollection = mycollection;
@Override
public int hashCode()
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((mycollection == null) ? 0 : mycollection.hashCode());
return result;
@Override
public boolean equals(Object obj)
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyClassA other = (MyClassA) obj;
if (id != other.id)
return false;
if (name == null)
if (other.name != null)
return false;
else if (!name.equals(other.name))
return false;
if (mycollection == null)
if (other.mycollection != null)
return false;
else if (!mycollection.equals(other.mycollection))
return false;
return true;
@Override
public String toString()
return "MyClassA [id=" + id + ", name=" + name + ", mycollection=" + mycollection + "]";
MyClassB:
@Entity
@Table(name = "bbb")
public class MyClassB
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
@NotEmpty
@Size(min = 3, max = 255)
@Column(name = "name", nullable = false)
private String name;
@NotEmpty
@Size(min = 3, max = 255)
@Column(name = "elementname", nullable = false)
private String elementname;
@NotEmpty
@Size(min = 3, max = 255)
@Column(name = "type", nullable = false)
private String type;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<MyClassC> mycollection = new HashSet<MyClassC>();
public MyClassB()
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getElementname()
return elementname;
public void setElementname(String elementname)
this.elementname = elementname;
public String getType()
return type;
public void setType(String type)
this.type = type;
public Set<MyClassC> getMyCollection()
return mycollection;
public void setMyCollection(Set<MyClassC> mycollection)
this.mycollection = mycollection;
@Override
public int hashCode()
final int prime = 31;
int result = 1;
result = prime * result + ((elementname == null) ? 0 : elementname.hashCode());
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
Line 79---> result = prime * result + ((mycollection == null) ? 0 : mycollection.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
@Override
public boolean equals(Object obj)
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyClassB other = (MyClassB) obj;
if (elementname == null)
if (other.elementname != null)
return false;
else if (!elementname.equals(other.elementname))
return false;
if (id != other.id)
return false;
if (name == null)
if (other.name != null)
return false;
else if (!name.equals(other.name))
return false;
if (mycollection == null)
if (other.mycollection != null)
return false;
else if (!mycollection.equals(other.mycollection))
return false;
if (type == null)
if (other.type != null)
return false;
else if (!type.equals(other.type))
return false;
return true;
@Override
public String toString()
return "MyClassB [id=" + id + ", name=" + name + ", elementname=" + elementname + ", type=" + type + ", mycollection=" + mycollection + "]";
MyClassC:
@Entity
@Table(name = "ccc")
public class MyClassC
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
@NotEmpty
@Size(min = 3, max = 255)
@Column(name = "name", nullable = false)
private String name;
@NotEmpty
@Size(min = 3, max = 255)
@Column(name = "value", nullable = false)
private String value;
public MyClassC()
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getValue()
return value;
public void setValue(String value)
this.value = value;
@Override
public int hashCode()
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
@Override
public boolean equals(Object obj)
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyClassC other = (MyClassC) obj;
if (id != other.id)
return false;
if (name == null)
if (other.name != null)
return false;
else if (!name.equals(other.name))
return false;
if (value == null)
if (other.value != null)
return false;
else if (!value.equals(other.value))
return false;
return true;
@Override
public String toString()
return "MyClassC [id=" + id + ", name=" + name + ", value=" + value + "]";
当我尝试在我的控制器中获取所有 MyClassA 对象时,出现以下异常:
2016-09-28 10:10:46 调试 DefaultHandlerExceptionResolver:134 - 从处理程序 [public org.springframework.http.ResponseEntity> com.example.controller.MyController.listAllMyClassA()] 解决异常:java.lang.NullPointerException 2016-09-28 10:10:46 调试 DispatcherServlet:989 - 无法完成请求 java.lang.NullPointerException 在 org.hibernate.engine.internal.StatefulPersistenceContext.getLoadedCollectionOwnerOrNull(StatefulPersistenceContext.java:756) 在 org.hibernate.event.spi.AbstractCollectionEvent.getLoadedOwnerOrNull(AbstractCollectionEvent.java:75) 在 org.hibernate.event.spi.InitializeCollectionEvent.(InitializeCollectionEvent.java:36) 在 org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1931) 在 org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:559) 在 org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:261) 在 org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:555) 在 org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:143) 在 org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:316) 在 com.example.model.MyClassB.hashCode(MyClassB.java:79) 在 java.util.HashMap.hash(HashMap.java:338) 在 java.util.HashMap.put(HashMap.java:611) 在 java.util.HashSet.add(HashSet.java:219) 在 java.util.AbstractCollection.addAll(AbstractCollection.java:344) 在 org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:344) 在 org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:251) 在 org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:238) 在 org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:211) 在 org.hibernate.loader.Loader.endCollectionLoad(Loader.java:1157) 在 org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1126) 在 org.hibernate.loader.Loader.processResultSet(Loader.java:973) 在 org.hibernate.loader.Loader.doQuery(Loader.java:921) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) 在 org.hibernate.loader.Loader.doList(Loader.java:2554) 在 org.hibernate.loader.Loader.doList(Loader.java:2540) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) 在 org.hibernate.loader.Loader.list(Loader.java:2365) 在 org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126) 在 org.hibernate.internal.SessionImpl.list(SessionImpl.java:1718) 在 org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380) 在 com.example.dao.MyClassADaoImpl.findAllGroupQuestions(MyClassADaoImpl.java:42) 在 com.example.service.MyClassAImpl.findAllGroupQuestions(MyClassAImpl.java:41) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 在 org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 在 com.sun.proxy.$Proxy63.findAllGroupQuestions(未知来源) 在 gr.citystore.helios.controller.QuestionaireController.listAllGroupQuestions(QuestionaireController.java:212) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:168) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:96) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745)
MyClassADaoImpl:
@SuppressWarnings("unchecked")
public List<MyClassA> findAllMyClassAs()
Criteria criteria = createEntityCriteria();
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return (List<MyClassA>) criteria.list();
最后,我的服务实现MyClassAImpl:
public List<MyClassA> findAllMyClassAs()
return dao.findAllMyClassAs();
我的 Hibernate 版本是 4.3.11.Final。如果您需要任何其他信息,请告诉我!谢谢
【问题讨论】:
您能否在您的代码 sn-p 中指出 MyClassB.java 中的第 79 行是哪一行?这也将帮助我们为您提供更具体的答案,说明为什么任何 null 都是 null 尽管有 hibernate 不可为空的注释(这就是为什么,目前,我没有将其标记为 ***.com/questions/218384/… 的副本)。 @JasonC,我在方法 hashCode 中编辑了 MyClassB,以指示哪一行是 79。 Be careful comparingClass
with ==
when using Hibernate,如果您启用了延迟加载,Hibernate 可以生成代理类并返回这些代理类的实例而不是您的实际类。与例如字段访问相同的处理equals
和 hashCode
;考虑改用吸气剂;这可能是也可能不是您问题的真正根源。考虑为您的散列和比较实现创建单元测试,包括从数据库查询的对象和手动构建的对象,以验证您的设置是否按预期工作。
@JasonC 我会考虑你的评论,谢谢你的付出。
【参考方案1】:
查看您的堆栈跟踪,我相信这个问题的根源在于您的 hashCode 方法:
com.example.model.MyClassB.hashCode(MyClassB.java:79) 在
尝试从您的 hashCode 方法中删除集合属性。我认为这对于计算类的哈希是不必要的。在大多数情况下,您使用业务键(即标识对象的唯一属性)。
https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes-equalshashcode.html
注意安全! :)
【讨论】:
仅在 hashCode 处?还是平等的? 同样的方法。我更改了答案,包括有关在休眠中实现 equal 和 hashCode 的参考。 @KostasC 在你这样做之前,让我们知道哪一行是第 79 行,这样你就不会修复错误的东西。这也将帮助我们为您提供一个答案,即尽管有 hibernate 不可为空的注释,但为什么任何为 null 的都是 null。 @JasonC,我在方法 hashCode 中编辑了 MyClassB,以指示哪一行是 79。 @OscarCosta,我删除了集合属性,异常消失了!谢谢以上是关于休眠 java.lang.NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
Sqoop - 尝试连接到 Oracle DB 服务器时出现 java.lang.NullPointerException
求助,Windows 2008如何配置睡眠(Sleep)、休眠(hibernate)、混合休眠(Hybird Sleep)、标准睡眠(Standby)