Eclipse链接JPA Select查询返回空字段值

Eclipse链接JPA Select查询返回空字段值,jpa,nullpointerexception,eclipselink,concurrent-programming,Jpa,Nullpointerexception,Eclipselink,Concurrent Programming,我们正在从一个小表“ACCESS\u STATUS”中获取数据,如下所示 身份证名称 1外部 2内部 当我们使用下面的JPA代码时:在特定场景中,当两个用户同时访问此表时,第一行的Name列被提取为NULL。此字段被进一步使用,以便引发空指针异常,应用程序停止工作,必须重新启动 JpaEntityManager jpaEm = JpaHelper.getEntityManager(em); ReadAllQuery query=new ReadAllQuery(AccessStatus.clas

我们正在从一个小表“ACCESS\u STATUS”中获取数据,如下所示

身份证名称 1外部 2内部

当我们使用下面的JPA代码时:在特定场景中,当两个用户同时访问此表时,第一行的Name列被提取为NULL。此字段被进一步使用,以便引发空指针异常,应用程序停止工作,必须重新启动

JpaEntityManager jpaEm = JpaHelper.getEntityManager(em);
ReadAllQuery query=new ReadAllQuery(AccessStatus.class);
 Collection accessStatus =  (Collection)jpaEm.getActiveSession().executeQuery(query)
如果使用如下所示的本机查询,则不存在此问题:

try {
preparedStatement=connection.prepareStatement(sb.toString());
resultSet=preparedStatement.executeQuery();

while (resultSet.next()) {
 id = resultSet.getString(1);
name = resultSet.getString(2);
accessStatus.add(new AccessStatus(id,name));

        }
    }

这是JPA/JavaEE中的一个bug吗?这个问题的永久解决方案是什么?

这不是严格的JPA,因为您正在访问EclipseLink会话以执行本机ReadAllQuery。严格的JPA将是

Collection accessStatus = em.createQuery("Select status from AccessStatus status").getResultList();
但它可能会给你同样的结果。问题可能不是JPA/EclipseLink/ORM bug,而是应用程序如何使用这些工具。首先,返回的实体将是一个托管实体,并反映您在会话/上下文中所做的任何更改,甚至是未受限制的更改。因此,请检查您是否正在以某种方式合并或持久化实体,或以其他方式填充具有空名称的实体。一个常见的错误是应用程序创建一个新实体,在设置与现有实体的关系时,只需创建一个新的空实例,而不是通过find或getReference调用获取该实体。这会设置外键,但您会得到您输入的内容,除非刷新该对象,否则这些内容将丢失数据

您可以通过对查询返回的AccessStatus调用em.refresh()来验证是否发生了这种情况。如果该名称随后被填充,您应该跟踪它是如何进入具有空值的上下文的