2017-05-14 12 views
-1

Java 8 웹 프로젝트에서 Java Persistence API (JPA)를 구현하려고합니다.JPA EntityManager 쿼리가 항상 NullPointerException을 반환하는 이유는 무엇입니까?

<?xml version="1.0" encoding="UTF-8"?> 
    <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1"> 
    <persistence-unit name="myDatabase" transaction-type="JTA"> 
     <non-jta-data-source>jdbc/myDB</non-jta-data-source> 
    </persistence-unit> 
    </persistence> 

내 JNDI 자원에 정의되어

톰캣 8. 내가 사용 persistence.jar을 실행하면 다음과 같이 내가이 persistence.xml 구성을 설정 한 EclipseLink가

에서입니다 context.xml 및 다른 클래스의 일반 DataSource로 쿼리 할 수 ​​있으므로 데이터베이스 연결이 제대로 작동하는지 테스트했습니다. 박사 대니 겁쟁이가 아니라 em.find, em.createNamedQuery의 하나를 얻을 수없는 큰 그림이, '자바 퍼시스턴스 API 12 장 : 현대 추억'

나는 자바 EE 7을 따랐습니다 등등.

내 데이터를 사용하여 액세스 엔티티 관리자 : 스터브]

@Singleton 
public class JPAPersonDataImpl { 
    @PersistenceUnit 
    private EntityManager em; 

    private Person getPersonById(int id) { 
     return (em.find(Person.class, id)); 
    } 
} 

내 데이터에 액세스하는 경우 엔티티 관리자 팩토리를 사용 : 스터브]

@Singleton 
public class JPAPersonDataImpl { 
    @PersistenceUnit(unitName = "myDatabase") 
    private EntityManagerFactory entityManagerFactory; 

    private Person getPersonById(int id) { 
     EntityManager em = entityManagerFactory.createEntityManager(); 
     try { 
      return (em.find(Person.class, id)); 
     } finally { 
      em.close(); 
     } 
    } 
} 

내 Person.class [스텁]

@Entity 
@NamedQueries(
     { 
       @NamedQuery(
         name = "Person.getAllPersons", 
         query = "select m from Person m" 
       ), 
       @NamedQuery(
         name = "Person.getPersonByUsername", 
         query = "select m from Person m where m.userName = :userName" 
       ), 
       @NamedQuery(
         name = "Person.getLastPersonCreated", 
         query = "select m from Person m order by m.PersonId desc" 
       ), 
       @NamedQuery(
         name = "Person.getUsernames", 
         query = "select m.userName from Person m" 
       ) 
     } 
) 
public class Person implements Serializable { 
    @Id 
    @Column(name="PersonId") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 
    private String userName; 
    private String firstName; 
    private String surname; 
    private Date joined; 

    public Person() {} 

    public Person(int id, String userName, String firstName, String surname, Date joined) { 
     this.id = id; 
     this.userName = userName; 
     this.firstName = firstName; 
     this.surname = surname; 
     this.joined = joined; 
    } 

    public int getId() { 
     return this.id; 
    } 

    public String getUserName() { 
     return this.userName; 
    } 

    public String getFirstName() { 
     return this.firstName; 
    } 

    public String getSurname() { 
     return this.surname; 
    } 

    public Date getJoinedDate() { 
     return this.joined; 
    } 
} 

NamedQueries를 실행하는 예제 (TypedQuery, Query 및 Native Query를 모두 작성했습니다. 모두 r입니다. NullPointer를) eturn :

@Singleton 
public class JPAPersonDataImpl { 
    @PersistenceUnit(unitName = "myDatabase") 
    private EntityManagerFactory entityManagerFactory; 

    // This can also be modifed to use EntityManager instead of EntityManagerFactory 
    private boolean userNameIsInUse(String username) { 
     EntityManager em = entityManagerFactory.createEntityManager(); 
     try { 
      TypedQuery<Person> queryUserNames = em.createNamedQuery("Person.getUsernames", Person.class); 
      List queryResultList = queryUserNames.setMaxResults(1).getResultList(); 
      return (matchInList(queryResultList, username)); 
     } finally { 
      em.close(); 
     } 
    } 
} 

왜하는 어떤 액세스 시도 (쿼리, 계속 유효한 JNDI 자원이있는 경우는, NullPointerException을 반환 등) 발견, 제거? EntityManager가 올바르게 설정되었는지 확인하기 위해 할 수있는 간단한 테스트가 있습니까?

+0

여러분은 여러분이'JPAPersonDataImpl'을 삽입하고 있지 않다고 추측하고 있습니다. – chrylis

+0

만약 당신이 그 전장의 스택 트레이스를 공유한다면 도움이 될 것입니다. –

+0

@chrylis가 대답을 가지고 있다고 생각합니다. 어떻게'JPAPersonDataImpl' 인스턴스의 생성을 처리하고 있습니까? 컨테이너 (Tomcat) 컨트롤에 제공되는'@ EJB' 주석을 주입해야합니다. 이 JPAPersonDataImpl bean = new JPAPersonDataImpl()처럼 자신을 인스턴스화해서는 안 * 않습니다 *. – Matt

답변