私はJava Persistence API(JPA)をJava 8 Webプロジェクトに実装しようとしています。なぜ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リソースを定義した:
にTomcat 8上に私が使用していますpersistence.jarを実行すると、以下のように私は私のpersistence.xmlの構成を設定したのEclipseLink
からですcontext.xmlと私はそれがデータベース接続が正しく機能しているので、別のクラス内の通常のDataSourceとしてクエリできることをテストしました。
私はのJava EE 7続いてきました:博士ダニー・カワードではなくem.findのいずれかを取得することはできません、em.createNamedQuery「れるJava Persistence API:現代の思い出第12章」、ビッグピクチャーを等を働かせる。
エンティティマネージャ使用してマイデータアクセス:[スタブ]
@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 [スタブ]
:エンティティマネージャファクトリを使用している場合は、[スタブ]@Singleton
public class JPAPersonDataImpl {
@PersistenceUnit
private EntityManager em;
private Person getPersonById(int id) {
return (em.find(Person.class, id));
}
}
マイデータへのアクセスを
@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のすべてを試してみました。ネイティブクエリも作成しました。すべて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