Bonjour,

Je suis débutante sur ce type de langages (Java/Objectify) et je rencontre un problème.

Je vous explique tout, je dispose de trois classes qui fonctionnent de la manière suivante:
Un Server a comme parent un Site qui a comme parent un Country.
J'ai travaillé sur mes classes Site et Country sans problème, j'arrive à récupérer facilement les informations de mon Country en passant par un Site, exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
Site site = ofy().load().type(Site.class).filter("name", "Angers").first().now();
System.out.println(ofy().load().key(site.getCountry()).now().getName());
Qui me retourne bien: "France"

Cependant, lorsque j'essaie de récupérer mon Site sur un Server de la même manière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
System.out.println("- Server->Site - "+ofy().load().key(a.getSite()).now().getName());
Qui me renvoie une java.lang.NullPointerException

D'ailleurs lorsque j'effectue simplement un getSite, celui-ci est effectivement null:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
Site x=ofy().load().key(a.getSite()).now();
if(x==null)
    System.out.println("null");
else
    System.out.println("NOT null");
Qui m'affiche bien "null".

Pourtant j'effectue un test directement dans mon constructeur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
System.out.println(serverSite.toString()+"="+this.site.toString());
Qui m'affiche bien: Key<?>(Site(4754288278503424))=Key<?>(Site(4754288278503424))

Pour en finir à propos des tests, un petit dernier que j'effectue après création de la Key dans le programme (et je pense que mon problème vient d'ici):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
List<Site> yy=ofy().load().type(Site.class).filter("name","Dijon").list();
cleSitekey = Key.create(Site.class, yy.get(0).getId());
System.out.println("CLE SITE: "+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));
}
Qui m'affiche 0 pour la correspondance:

Élément à l'index 0 = Dijon - 4754288278503424
Key<?>(Site(4754288278503424))
0


N'ayant que des connaissances en BDD relationnelles, je me demande si je n'ai pas un peu de mal à comprendre le fonctionnement du DataStore, des Keys et si c'est une erreur de compréhension de ma part ou si c'est dans mon code que je me suis trompée.

Je vous fais un abrégé rapide de mes classes Site et Serveur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
@Entity
@Index 
public class Site {
	@Id Long idSite; 
	private String name;
	@Parent Key<Country> country; 
 
	@SuppressWarnings("unused")
	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
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
@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){
		System.out.println("enter constructeur.");
		if(serverSite!=null){
 
			List<Server> l=ofy().load().type(Server.class).filter("hostname",serverHostName).filter("ip",serverIp).ancestor(serverSite).list();     
			System.out.println("list constructeur 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 des valeurs enregistrées");
				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 des valeurs enregistrées fin");
	    		try{
				ofy().save().entity(this).now();
	        	System.out.println("Object created.");
	    		}
	    		catch(Exception ex){
	    			System.out.println("Enregistrement interrompu.");
	    			System.out.println(ex.getMessage());	
	    			System.out.println(ex.getLocalizedMessage());			
	    		}	
	        }
	        else
	        {
	        	System.out.println("Object creation stopped, it already exists.");
	        }
		}
	}
//getters/setters/etc
}
En vous remerciant de votre attention.