Java Hibernate:在compareTo使用SortedSet包装子集合时出现空异常

Java Hibernate:在compareTo使用SortedSet包装子集合时出现空异常,java,hibernate,Java,Hibernate,我有两个域类,它们使用注释与hibernate映射 一是, @Entity @Table(name = "SAS_Dictionary_Variable") public class DictionaryVariable { private Long id; private String name; private String description; private String format; private String tableName;

我有两个域类,它们使用注释与hibernate映射

一是,

@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;
}
@实体
@表(name=“SAS\U字典\U变量”)
公共类字典变量{
私人长id;
私有字符串名称;
私有字符串描述;
私有字符串格式;
私有字符串表名;
专用分类集词典入口;
@身份证
@生成值
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
this.description=描述;
}
公共字符串getFormat(){
返回格式;
}
公共void setFormat(字符串格式){
this.format=格式;
}
公共字符串getTableName(){
返回表名;
}
public void setTableName(字符串tableName){
this.tableName=tableName;
}
@OneToMany(cascade=CascadeType.ALL,orphan=true,
fetch=FetchType.LAZY,mappedBy=“dictionaryVariable”)
@自然的
公共分类集getDictionaryEntry(){
返回词典入口;
}
公共作废设置字典入口(分类设置字典入口){
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);
}
@实体
@表(name=“SAS\U字典\U条目”)
公共类DictionaryEntry实现了可比较的{
私人长id;
私有字符串码;
私有字符串描述;
私有字典可变字典可变;
@身份证
@生成值
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getCode(){
返回码;
}
公共无效设置码(字符串码){
this.code=代码;
}
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
this.description=描述;
}
@manytone(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
@JoinColumn(name=“Variable\u Id”)
公共字典变量getDictionaryVariable(){
返回字典变量;
}
public void setDictionaryVariable(DictionaryVariable DictionaryVariable){
this.dictionaryVariable=dictionaryVariable;
}
@凌驾
公共int比较(字典输入){
返回this.code.compareTo(that.code);
}
}

因此,每个dictionaryVariable都有许多dictionaryEntry,一对多。 现在我有这样的刀法

@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;
}
@覆盖
公共列表getAllByTableName(字符串tbname){
Query Query=currentSession().createQuery(“从DictionaryVariable dv left join fetch dv.dictionaryEntry de where dv.tableName=:tableName”);
query.setParameter(“tableName”,tbname);
@抑制警告(“未选中”)
Set result=newlinkedhashset(query.list());
List vars=new ArrayList();
变量addAll(0,结果);
返回变量;
}
当我运行这个方法时,Hibernate在DictionaryEntry类中的compareTo方法中抛出java.lang.NullPointerException。我发现这是因为this.code为null,所以引发了null异常。但是,同时,this.id不为null。还有一条我从未见过的有线警告。为什么会发生这种情况

错误:

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:选择dictionary0.id作为id1\u 2\u 0\u,dictionary1\u.id作为id1\u 1\u,dictionary0.description作为description2\u 2\u 0\u,dictionary0.format作为format3\u 2\u 0\u,dictionary0.name作为name4\u 2\u 0\u,dictionary0\u.tableName作为tableName作为tableName作为tableName 5\u 2\u 0,dictionary1\u.code作为code2\u 1\u 1,dictionary1.description作为description,字典1.Variable.Id作为变量,字典1.Variable.Id作为变量,字典2.Id作为变量,字典1.Id作为变量,字典1.Id作为变量,从SAS字典变量字典0左外部连接SAS字典条目字典1,字典0.Id=字典1变量Id,其中字典0.tableName=?
警告:org.hibernate.engine.loading.internal.LoadContexts-hh000100:故障安全清理(集合):org.hibernate.engine.loading.internal。CollectionLoadContext@ed09de
2015年12月17日下午4:17:35 org.apache.catalina.core.StandardWrapper
严重:路径为[/sas]的上下文中Servlet[appServlet]的Servlet.service()引发了异常[请求处理失败;嵌套异常为java.lang.NullPointerException],其根本原因是
java.lang.NullPointerException
位于com.ccrs.sas.domain.DictionaryEntry.compareTo(DictionaryEntry.java:55)
位于com.ccrs.sas.domain.DictionaryEntry.compareTo(DictionaryEntry.java:1)
位于java.util.TreeMap.put(TreeMap.java:568)
在java.util.TreeSet.add处(TreeSet.java:255)
位于java.util.AbstractCollection.addAll(AbstractCollection.java:344)
位于java.util.TreeSet.addAll(TreeSet.java:312)
位于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:1156)
位于org.hibernate.loader.loader.initializeEntitiesAndCollections(loader.java:1125)
位于org.hibernate.loader.loader.processResultSet(loader.java:972)
位于org.hibernate.loader.loader.doQuery(loader.java:920)
在org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollections(loader.java:354)上
位于org.hibernate.loader.loader.doList(loader.java:2553)
位于org.hibernate.loader.loader.doList(loader.java:2539)
位于org.hibernate.loader.loader.listIgnoreQueryCache(loader.java:2369)
位于org.hibernate.loader.loader.list(loader.java:2364)
位于org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496)
在org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslat
Session session = getCurrentSession();
sessionFactory.getCurrentSession();