GAE Java 对象化找不到父对象
GAE Java Objectify Can't find a parent
我从 Java/Objectify 开始,遇到了问题。
(之前有个同事post我的法语问题,因为他不知道规则,我又没有账号。)
为了解释,我有 3 个 类 是这样工作的:
Server 有一个 Site parent 有一个 Country parent。
我在我的 类 站点和国家/地区工作时没有任何问题,我可以轻松地从站点保留我的国家/地区的数据。示例:
Site site = ofy().load().type(Site.class).filter("name", "Angers").first().now();
System.out.println(ofy().load().key(site.getCountry()).now().getName());
什么return:"France"
但是,当我尝试以相同的方式从服务器保留站点时:
System.out.println("- Server->Site - "+ofy().load().key(a.getSite()).now().getName());
我得到了一个java.lang.NullPointerException
顺便说一句,当我只做一个 getSite() 时,return 也为 null:
Site x=ofy().load().key(a.getSite()).now();
if(x==null)
System.out.println("null");
else
System.out.println("NOT null");
结果:无
但是,我正在我的构造函数中做一些测试来验证密钥是否保存完好:
System.out.println(serverSite.toString()+"="+this.site.toString());
什么returns 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));
}
什么 return 很好 0 以精确表示键具有相同的值:
Élément à l'index 0 = 第戎 - 4754288278503424
Key(站点(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());
我从 Java/Objectify 开始,遇到了问题。
(之前有个同事post我的法语问题,因为他不知道规则,我又没有账号。)
为了解释,我有 3 个 类 是这样工作的: Server 有一个 Site parent 有一个 Country parent。
我在我的 类 站点和国家/地区工作时没有任何问题,我可以轻松地从站点保留我的国家/地区的数据。示例:
Site site = ofy().load().type(Site.class).filter("name", "Angers").first().now();
System.out.println(ofy().load().key(site.getCountry()).now().getName());
什么return:"France"
但是,当我尝试以相同的方式从服务器保留站点时:
System.out.println("- Server->Site - "+ofy().load().key(a.getSite()).now().getName());
我得到了一个java.lang.NullPointerException
顺便说一句,当我只做一个 getSite() 时,return 也为 null:
Site x=ofy().load().key(a.getSite()).now();
if(x==null)
System.out.println("null");
else
System.out.println("NOT null");
结果:无
但是,我正在我的构造函数中做一些测试来验证密钥是否保存完好:
System.out.println(serverSite.toString()+"="+this.site.toString());
什么returns 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));
}
什么 return 很好 0 以精确表示键具有相同的值:
Élément à l'index 0 = 第戎 - 4754288278503424
Key(站点(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());