簡體   English   中英

GAE Java Objectify找不到父項

[英]GAE Java Objectify Can't find a parent

我從Java / Objectify開始,遇到了問題。

(一位同事以前只是用法語發布我的問題,因為他不了解規則,我也沒有帳戶。)

解釋一下,我有3個類,它們的工作方式是:服務器具有站點父級,而國家(地區)父級。

我在我的網站和國家/地區課程上沒有任何問題,我可以輕松地從網站上保存我的國家/地區數據。 例:

Site site = ofy().load().type(Site.class).filter("name", "Angers").first().now();
System.out.println(ofy().load().key(site.getCountry()).now().getName());

返回結果: “法國”

但是,當我嘗試以相同方式將站點保留在服務器中時:

System.out.println("- Server->Site - "+ofy().load().key(a.getSite()).now().getName());

我有一個java.lang.NullPointerException

順便說一句,當我只執行getSite()時,返回值也為null:

Site x=ofy().load().key(a.getSite()).now();
if(x==null)
System.out.println("null");
else
System.out.println("NOT null");

結果: null

但是,我正在構造函數中進行一些測試,以驗證密鑰是否妥善保存:

System.out.println(serverSite.toString()+"="+this.site.toString());

什么返回Key(Site(4754288278503424))= Key(Site(4754288278503424))

這是在程序中創建密鑰之后我正在做的另一項測試

List<Site> yy=ofy().load().type(Site.class).filter("name","Dijon").list();
cleSitekey = Key.create(Site.class, yy.get(0).getId());
System.out.println("SITE KEY: "+cleSiteid.toString());
List<Site> l=ofy().load().type(Site.class).filter("name",yy.get(0).getName()).list();       
for(int i = 0; i < l.size(); i++){
Key<Site> keysiteserv= Key.create(Site.class, l.get(i).getId());
System.out.println("index " + i + " = " + l.get(i).getName()+" - "+ l.get(i).getId());
System.out.println(cleSitekey.toString());
System.out.println(cleSitekey.compareTo(keysiteserv));
}

正確返回0的結果是,這些鍵具有相同的值:

索引0 =第戎-4754288278503424

鍵(網站(4754288278503424))

0

僅具有關系數據庫方面的經驗,我不知道我是否不了解Keys概念,是否誤解了它,或者是否不知道該怎么做。

我的班級站點和服務器:

@Entity
@Index 
public class Site {
@Id Long idSite; 
private String name;
@Parent Key<Country> country; 

private Site(){}

public Site(String siteName, Key<Country> siteCountry){
if(siteCountry!=null){
List<Site> l=ofy().load().type(Site.class).filter("name",siteName).ancestor(siteCountry).list();

if(l.size()==0){
System.out.println("Object created.");
this.name=siteName;
this.country=siteCountry;
ofy().save().entity(this).now();
}
else
{
System.out.println("Object creation stopped, it already exists.");
}
}
}
//getters+setters etc
}

@Entity
@Index 
public class Server {

@Id Long idServer;
private String hostname;
private String ip;
private int status;
private String statusDate; 
private String lastTimeUp; 
@Parent Key<Site> site;

@SuppressWarnings("unused")
private Server(){}

public Server(String serverHostName,  String serverIp, int serverStatus, String serverStatusDate, String serverLastTimeUp, Key<Site> serverSite){
if(serverSite!=null){

List<Server> l=ofy().load().type(Server.class).filter("hostname",serverHostName).filter("ip",serverIp).ancestor(serverSite).list();     
System.out.println("list ok.");
if(l.size()==0){
this.hostname = serverHostName;
this.ip = serverIp;
this.status = serverStatus;
this.statusDate = serverStatusDate;
this.lastTimeUp = serverLastTimeUp;
this.site = serverSite;
System.out.println("Test start");
System.out.println(serverHostName+"="+this.hostname);
System.out.println(serverIp+"="+this.ip);
System.out.println(serverStatus+"="+this.status);
System.out.println(serverLastTimeUp+"="+this.lastTimeUp);
System.out.println(serverSite.toString()+"="+this.site.toString());
System.out.println("Test end");
try{
ofy().save().entity(this).now();
System.out.println("Object created.");
}
catch(Exception ex){
System.out.println("Saving interrupted.");
System.out.println(ex.getLocalizedMessage());   
}   
}
else
{
System.out.println("Object creation stopped, it already exists.");
}
}
}
//getters/setters/etc
}

感謝您的關注。

在我看來,您構建密鑰的方式並不正確。 根據文檔,如果實體具有父級,則必須使用Key.create(parent,class,id)方法重載,該方法對父級有重載。 例如,要為以站點為父節點的服務器對象創建密鑰,您必須執行以下操作:

//注意:網站是父網站

Key<Server> serverKey = Key.create(site, Server.class, server.getId());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM