【问题标题】:Hibernate: Null exception at compareTo using SortedSet to wrap sub collectionHibernate:使用 SortedSet 包装子集合的 compareTo 出现空异常
【发布时间】:2016-03-25 03:26:22
【问题描述】:

我有两个使用注解映射到休眠的域类。

一个是,

@Entity
@Table(name = "SAS_Dictionary_Variable")
public class DictionaryVariable {
    private Long id;
    private String name;
    private String description;
    private String format;
    private String tableName;
    private SortedSet<DictionaryEntry> dictionaryEntry;

@Id
@GeneratedValue
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getDescription() {
    return description;
}
public void setDescription(String description) {
    this.description = description;
}
public String getFormat() {
    return format;
}
public void setFormat(String format) {
    this.format = format;
}
public String getTableName() {
    return tableName;
}
public void setTableName(String tableName) {
    this.tableName = tableName;
}

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, 
        fetch = FetchType.LAZY, mappedBy = "dictionaryVariable")
@SortNatural
public SortedSet<DictionaryEntry> getDictionaryEntry() {
    return dictionaryEntry;
}
public void setDictionaryEntry(SortedSet<DictionaryEntry> dictionaryEntry) {
    this.dictionaryEntry = dictionaryEntry;
}

}

另一个是:

@Entity
@Table(name = "SAS_Dictionary_Entry")
public class DictionaryEntry implements Comparable<DictionaryEntry>{
    private Long id;
    private String code;
    private String description;
    private DictionaryVariable dictionaryVariable;

@Id
@GeneratedValue
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public String getCode() {
    return code;
}
public void setCode(String code) {
    this.code = code;
}
public String getDescription() {
    return description;
}
public void setDescription(String description) {
    this.description = description;
}

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "Variable_Id")
public DictionaryVariable getDictionaryVariable() {
    return dictionaryVariable;
}
public void setDictionaryVariable(DictionaryVariable dictionaryVariable) {
    this.dictionaryVariable = dictionaryVariable;
}

@Override
public int compareTo(DictionaryEntry that) {
    return this.code.compareTo(that.code);
}

}

所以,每个dictionaryVariable 都有很多dictionaryEntry,一对多。 现在,我有这样的DAO方法,

@Override
public List<DictionaryVariable> getAllByTableName(String tbname) {
    Query query = currentSession().createQuery("from DictionaryVariable dv left join fetch dv.dictionaryEntry de where dv.tableName = :tableName ");
    query.setParameter("tableName", tbname);
    @SuppressWarnings("unchecked")
    Set<DictionaryVariable> result = new LinkedHashSet<DictionaryVariable>(query.list());
    List<DictionaryVariable> vars = new ArrayList<DictionaryVariable>();
    vars.addAll(0, result);
    return vars;
}

当我运行这个方法时,Hibernate 在 DictionaryEntry 类的 compareTo 方法中抛出 java.lang.NullPointerException。我发现这是因为 this.code 为空,所以抛出了空异常。但是,与此同时,this.id 不为空。还有一个我以前从未见过的有线警告。为什么会这样?

错误:

Hibernate: select dictionary0_.id as id1_2_0_, dictionary1_.id as id1_1_1_, dictionary0_.description as description2_2_0_, dictionary0_.format as format3_2_0_, dictionary0_.name as name4_2_0_, dictionary0_.tableName as tableName5_2_0_, dictionary1_.code as code2_1_1_, dictionary1_.description as description3_1_1_, dictionary1_.Variable_Id as Variable_Id4_1_1_, dictionary1_.Variable_Id as Variable_Id4_2_0__, dictionary1_.id as id1_1_0__ from SAS_Dictionary_Variable dictionary0_ left outer join SAS_Dictionary_Entry dictionary1_ on dictionary0_.id=dictionary1_.Variable_Id where dictionary0_.tableName=?
WARN : org.hibernate.engine.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@ed09de<rs=oracle.jdbc.driver.OracleResultSetImpl@5ef1af>
Dec 17, 2015 4:17:35 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/sas] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at com.ccrs.sas.domain.DictionaryEntry.compareTo(DictionaryEntry.java:55)
    at com.ccrs.sas.domain.DictionaryEntry.compareTo(DictionaryEntry.java:1)
    at java.util.TreeMap.put(TreeMap.java:568)
    at java.util.TreeSet.add(TreeSet.java:255)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
    at java.util.TreeSet.addAll(TreeSet.java:312)
    at org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:344)
    at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:251)
    at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:238)
    at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:211)
    at org.hibernate.loader.Loader.endCollectionLoad(Loader.java:1156)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1125)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:972)
    at org.hibernate.loader.Loader.doQuery(Loader.java:920)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
    at org.hibernate.loader.Loader.doList(Loader.java:2553)
    at org.hibernate.loader.Loader.doList(Loader.java:2539)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)
    at org.hibernate.loader.Loader.list(Loader.java:2364)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
    at com.ccrs.sas.dao.impl.DictionaryVariableDaoImpl.getAllByTableName(DictionaryVariableDaoImpl.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy34.getAllByTableName(Unknown Source)
    at com.ccrs.sas.business.DictionaryService.getAllDictionaryVariableByTableName(DictionaryService.java:26)
    at com.ccrs.sas.controller.DataRequestController.getDictVars(DataRequestController.java:209)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1526)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1482)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

谢谢!

【问题讨论】:

  • 把你的错误堆栈跟踪
  • 您确定表中的所有行都没有空代码值吗?
  • 我更新了帖子,还有来自hibernate的警告
  • 我想说这只是意味着 DictionaryEntry 的数据库中有一个空代码。

标签: java hibernate


【解决方案1】:

有一些事情可能是原因。

DAO 似乎没有获取会话。所以我想知道它应该从哪里获取数据?还是你把交易服务放到别处了? 您必须添加:

Session session = getCurrentSession();

当你实现了这个方法。否则你可以添加:

sessionFactory.getCurrentSession();

【讨论】:

    【解决方案2】:

    是 DictionaryEntry 在数据库中有一个空代码。评论是对的,但我无法选择它们作为正确答案,所以我在这里发布。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 2017-01-11
      • 2013-04-20
      • 2021-04-03
      • 1970-01-01
      • 2012-08-27
      • 2012-12-29
      • 2018-08-06
      相关资源
      最近更新 更多