我從Maven使用datanucleus 3.2.7,嘗試使用Amazon S3 JPA提供程序。我可以成功地將數據寫入到S3中,但是當我調用query.getResultList()時,通過使用「SELECT u FROM User u」或「SELECT u FROM User u WHERE id =:id」查詢會導致引發NullPointerException。NullPointerException使用datanucleus-json與S3
使用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);
User.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被賦予一個空id。
請告訴我在第16行中Main.main發生了什麼? –
'Main.main()Line - 16'? – Sage
列表 users = query.getResultList(); //這裏是空指針異常(這是第16行!) –
mseddon