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가 올바르게 설정되었는지 확인하기 위해 할 수있는 간단한 테스트가 있습니까?
여러분은 여러분이'JPAPersonDataImpl'을 삽입하고 있지 않다고 추측하고 있습니다. – chrylis
만약 당신이 그 전장의 스택 트레이스를 공유한다면 도움이 될 것입니다. –
@chrylis가 대답을 가지고 있다고 생각합니다. 어떻게'JPAPersonDataImpl' 인스턴스의 생성을 처리하고 있습니까? 컨테이너 (Tomcat) 컨트롤에 제공되는'@ EJB' 주석을 주입해야합니다. 이 JPAPersonDataImpl bean = new JPAPersonDataImpl()처럼 자신을 인스턴스화해서는 안 * 않습니다 *. – Matt