0

Мы извлекаем данные из таблицы «ACCESS_STATUS», как показано ниже.Eclipse link JPA Select Query возвращает значение нулевого поля

ID NAME 1 Внешний 2 Внутренний

Когда мы используем ниже JPA код: В конкретном случае, когда два пользователя одновременно получить доступ к этой таблице в столбце Имя первой строки выбирается в качестве НОЛЬ. Это поле используется далее, поэтому исключается исключение нулевого указателя, и приложение перестает работать, и его необходимо перезапустить.

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/Java EE? Что такое постоянное решение этой проблемы?

ответ

1

Это не строгое JPA, поскольку вы обращаетесь к сеансу EclipseLink для выполнения собственного ReadAllQuery. Строгий JPA будет

Collection accessStatus = em.createQuery("Select status from AccessStatus status").getResultList(); 

, но он, скорее всего, даст вам тот же результат. Проблема, скорее всего, не ошибка JPA/EclipseLink/ORM, а то, как ваше приложение использует эти инструменты. Во-первых, возвращаемый объект будет управляемым сущностью и отражает любые изменения, внесенные вами в сеанс/контекст - даже неработающие. Поэтому убедитесь, что вы не каким-то образом объединяете или сохраняете сущности или не заполняете объекты, имеющие нулевое имя. Общей ошибкой является то, что приложения создают новый объект и устанавливают связь с существующим сущностью вместо того, чтобы получать его с вызовом find или getReference, просто создайте новый пустой экземпляр. Это устанавливает внешний ключ, но вы получаете то, что вы вложили, что будет отсутствовать данные, если этот объект не будет обновлен.

Вы можете убедиться, что это происходит путем вызова em.refresh() в AccessStatus, возвращенного из запроса. Если имя затем заполнено, вы должны отслеживать, как он попадает в контекст с нулевыми значениями.

Смежные вопросы