Amazon S3 JPA プロバイダーを使用しようとして、Maven の datanucleus 3.2.7 を使用しています。S3 にデータを正常に書き込むことはできますが、「SELECT u FROM User u」または「SELECT u FROM User u WHERE id = :id」を使用してクエリを実行すると、query.getResultList() を呼び出すと NullPointerException がスローされます。
RDBMS プロバイダーを使用すると、すべてが完全に機能します。私が間違っていることはありますか?
Main.java
EntityManagerFactory factory = Persistence.createEntityManagerFactory("MyUnit");
EntityManager entityManager = factory.createEntityManager();
Query query = entityManager.createQuery("SELECT u FROM User u", User.class);
List<User> users = query.getResultList(); // Null pointer exception here (This is line 16!)
for(User u:users)
System.out.println(u);
ユーザー.java
package test;
import javax.persistence.*;
@Entity
@Table(name = "User")
public class User {
@Id
public String id;
public String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String toString() {
return id+" : "+name;
}
}
persistence.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="MyUnit">
<class>test.User</class>
<exclude-unlisted-classes />
<properties>
<properties>
<property name="datanucleus.ConnectionURL" value="amazons3:http://s3.amazonaws.com/" />
<property name="datanucleus.ConnectionUserName" value="xxxxx" />
<property name="datanucleus.ConnectionPassword" value="xxxxx" />
<property name="datanucleus.cloud.storage.bucket" value="my-bucket" />
</properties>
<property name="datanucleus.autoCreateSchema" value="true" />
</properties>
</persistence-unit>
</persistence>
例外
java.lang.NullPointerException
at org.datanucleus.NucleusContext.isClassWithIdentityCacheable(NucleusContext.java:1840)
at org.datanucleus.ExecutionContextImpl.getObjectFromLevel2Cache(ExecutionContextImpl.java:5287)
at org.datanucleus.ExecutionContextImpl.getObjectFromCache(ExecutionContextImpl.java:5191)
at org.datanucleus.ExecutionContextImpl.findObject(ExecutionContextImpl.java:3137)
at org.datanucleus.store.json.CloudStoragePersistenceHandler.getObjectsOfCandidateType(CloudStoragePersistenceHandler.java:367)
at org.datanucleus.store.json.query.JPQLQuery.performExecute(JPQLQuery.java:94)
at org.datanucleus.store.query.Query.executeQuery(Query.java:1786)
at org.datanucleus.store.query.Query.executeWithMap(Query.java:1690)
at org.datanucleus.api.jpa.JPAQuery.getResultList(JPAQuery.java:194)
at test.Main.main(Main.java:16)
このエラーは、datanucleus がエントリの JSON を逆シリアル化するときに発生しているようです。バケットからすべてを削除すると、問題なく空のセットが返されます。L2 キャッシュをオフにすることで、別の場所で例外が発生するようにしました。ExecutionContextImpl.findObject に null id が与えられているようです。