1

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 が与えられているようです。

4

1 に答える 1

1

datanucleus-jsonバージョン3.2.1で修正される可能性がありますが、それはあなたが確認することです

于 2013-10-21T14:39:56.857 に答える