2013-10-19 20 views
0

我從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。

+0

請告訴我在第16行中Main.main發生了什麼? –

+0

'Main.main()Line - 16'? – Sage

+0

列表 users = query.getResultList(); //這裏是空指針異常(這是第16行!) – mseddon

回答

0

DataNucleus將JSON的版本3.2.1 可能修復了,但是這對於您確認

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – Bucket

+1

當然它提供了一個答案。這是比用戶使用的版本更新的版本,並可能解決他的問題。 – DataNucleus