em.createQuery продолжает возвращать ноль

У меня есть это приложение, которое я использую JSF 2.0 и EclipseLink, у меня есть объекты, созданные для базы данных, созданной в MySQL, Созданные эти объекты с использованием NetBeans 7.1.2, оно создается автоматически.

Затем я использую сессионные бины для работы с этими объектами, дело в том, em.createQuery всегда возвращает ноль, хотя я проверил NamedQueries в сущностях, и они идеально совпадают

Пример из сущностей с именами запросов:-

@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
    @NamedQuery(name = "Users.findByUserId", query = "SELECT u FROM Users u WHERE u.userId = :userId"),
    @NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"),
    @NamedQuery(name = "Users.findByEmail", query = "SELECT u FROM Users u WHERE u.email = :email"),

обратите внимание, как я использую этот запрос findByEmail в сессионном компоненте:

public Users findByEmail(String email){
        em.getTransaction().begin();
        String find = "Users.findByEmail";
        Query query = em.createNamedQuery(find);
        query.setParameter("email", email);
        Users user = (Users) query.getSingleResult();

но он всегда возвращает значение null из этого em.createNamedQuery, сначала я попытался использовать.createQuery, но это также не принесло пользы.

трассировка стека исключения

Caused by: java.lang.NullPointerException
    at com.readme.entities.sessionBeans.UsersFacade.findByEmail(UsersFacade.java:48)
    at com.readme.user.signup.SignupBean.checkAvailability(SignupBean.java:137)
    at com.readme.user.signup.SignupBean.save(SignupBean.java:146)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)

В чем проблема здесь?

1 ответ

Если em.createNamedQuery(find) на самом деле это утверждение, которое выбрасывает NullPointerException в вашем случае, тогда происходит нечто довольно странное.

Скорее всего, NullPointerException выбрасывается при первом использовании em ссылка в em.getTransaction().begin(), Если это так, то очень распространенной причиной является то, что ваш менеджер сущностей не внедрен, потому что внедрение работает только в управляемых классах (подробности см. В этом вопросе). Если вы создали сессионный компонент с помощью новой операции, он не управляется.

Другая распространенная причина заключается в том, что аннотация @Persistenceontext просто отсутствует.

Другие вопросы по тегам