2012-07-22 177 views
0

我正在构建一个GWT应用程序,以访问在服务器端使用JDO持久保存的房屋列表。然后通过RPC“getHouseService”将房屋列表移动到客户端以显示和操作。之后他们不会返回并保存在服务器端。JDO查询返回零结果

当我运行应用程序并执行RPC服务时,客户端总是得到一个空的列表。 在测试期间,我注意到我在调试模式下的ide(eclipse)注意到getHouse中返回列表的值是一个StreamingQueryResult。

我在做什么错?我一直在这个问题上停留了一个多星期,并且在网上找不到相关的解决方案。

这是我写我的数据持久化工作代码:

public static PersistenceManagerFactory getPersistenceManagerFactory() { 
     return pmfInstance; 
    } 

    public void addHouse(List<House> listofHouses) { 
     PersistenceManager pm = getPersistenceManagerFactory().getPersistenceManager(); 
     try { 
      pm.makePersistentAll(listofHouses); 
      System.out.println("after makePersistentAll"); 
     } 
     finally { 
      pm.close(); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    public List<House> getHouses() { 
     PersistenceManager pm = getPersistenceManagerFactory().getPersistenceManager(); 
    List<House> houseList = (List<House>) pm.newQuery("select from " + House.class.getName()).execute(); 
    return houseList; 
    } 

众议院类是:

package vancouverHEA.shared; 

import javax.jdo.annotations.IdGeneratorStrategy; 
import javax.jdo.annotations.IdentityType; 
import javax.jdo.annotations.PersistenceCapable; 
import javax.jdo.annotations.Persistent; 
import javax.jdo.annotations.PrimaryKey; 

import org.datanucleus.jpa.annotations.Extension; 

import com.google.gwt.user.client.rpc.IsSerializable; 

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true") 
public class House extends Building implements IsSerializable { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true") 
    private Long key; 
    @Persistent (serialized = "true") 
    java.lang.Double landPrice; 
    @Persistent (serialized = "true") 
    java.lang.Double housePrice; 
    @Persistent (serialized = "true") 
    java.lang.Boolean forSale; 
    @Persistent (serialized = "true") 
    private java.lang.String realtorContact; 
    @Persistent (serialized = "true") 
    private java.lang.Integer listPrice; 
    @Persistent (serialized = "true") 
    private java.lang.Integer yrBuilt; 
    @Persistent (serialized = "true") 
    private java.lang.Integer yrReno; 
    @Persistent (serialized = "true") 
    private java.lang.String postalCode; 
    @Persistent (serialized = "true") 
    java.lang.Double latitude; 
    @Persistent (serialized = "true") 
    java.lang.Double longitude; 

    String STRATA = "Strata"; 
    String SINGLE = "Single House" ; 


    public House(double landPrice, double improvPrice, String address, 
      String postalCode, int yrBuilt, int yrReno) { 
     super(); 
     this.landPrice = landPrice; 
     this.housePrice = improvPrice; 
     this.address = address; 
     this.postalCode = postalCode.trim().toUpperCase(); 
     this.yrBuilt = yrBuilt; 
     this.yrReno = yrReno; 
    } 


    public String getPostalCode() { 
     return postalCode; 
    } 


    public void setPostalCode(String postalCode) { 
     this.postalCode = postalCode.trim().toUpperCase(); 
    } 


    public double getLatitude() { 
     return latitude; 
    } 


    public void setLatitude(double latitude) { 
     this.latitude = latitude; 
    } 


    public double getLongitude() { 
     return longitude; 
    } 


    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 



    public double getPrice() { 
     return this.landPrice + this.housePrice; 
    } 

    public boolean isForSale() { 
     return forSale; 
    } 


    public void setForSale(boolean forSale) { 
     this.forSale = forSale; 
    } 


    public String getRealtorContact() { 
     return realtorContact; 
    } 


    public void setRealtorContact(String realtorContact) { 
     this.realtorContact = realtorContact; 
    } 


    public int getListPrice() { 
     return listPrice; 
    } 


    public void setListPrice(int listPrice) { 
     this.listPrice = listPrice; 
    } 


    public int getYrBuilt() { 
     return yrBuilt; 
    } 


    public void setYrBuilt(int yrBuilt) { 
     this.yrBuilt = yrBuilt; 
    } 


    public int getYrReno() { 
     return yrReno; 
    } 


    public void setYrReno(int yrReno) { 
     this.yrReno = yrReno; 
    } 


    public void setLandPrice(Double landPrice) { 
     this.landPrice = landPrice; 
    } 

    public double getLandPrice(){ 
     return landPrice; 
    } 

    public void setHousePrice(Double housePrice) { 
     this.housePrice = housePrice; 
    } 

    public double getHousePrice() { 
     return housePrice; 
    } 

} 
+0

你为什么要连续化Double,String,Boolean,Integer类型的字段?因此它们在查询中不可用。很明显,日志会告诉你所有正在发生的事情,所以最好检查它 – DataNucleus 2012-07-23 04:47:23

回答

0

这可能是因为在这个问题上描述了同样的问题:GWT retrieve list from datastore via serviceimpl要总结列表加载懒惰,所以如果你通过RPC返回列表它还没有被读取并返回一个空列表。在https://stackoverflow.com/a/7646549/66416这个问题上的答案建议在返回之前在列表上调用size(),这将触发列表被读取(虽然不确定这是否是最优雅的解决方案)。

+0

或者只是使用GAE JDO插件的v2 ... – DataNucleus 2012-07-23 12:33:03