2010-12-06 55 views
0

J'essaie de mapper une classe avec une clé composite dans un datanucleus. La clé primaire est composée de deux clés étrangères et je ne peux pas sembler être en mesure d'inclure ces classes étrangères dans le FetchGroup:Clé composite Datanucleus fetchgroup

annotations Utilisation:

@PrimaryKey 
@Column(name = idElementOne, allowsNull = "false") 
private Long idElementOne; 

@PrimaryKey 
@Column(name = "idElementTwo", allowsNull = "false"); 
private Long idElementTwo; 

, ouvrages

@PrimaryKey 
@Column(name = idElementOne, allowsNull = "false"); 
private ElementOne elementOne; 

@Column(name = "idElementTwo", allowsNull = "false"); 
private Long idElementTwo; 

œuvres

mais

@PrimaryKey 
@Column(name = idElementOne, allowsNull = "false") 
private ElementOne elementOne; 

@PrimaryKey 
@Column(name = "idElementTwo", allowsNull = "false"); 
private Long idElementTwo; 

ne fait pas.

Comment dois-je faire?

+0

Vous n'avez mentionné aucune métadonnée de groupe de récupération ou utilisation de l'API de groupe de récupération. Donc aucune idée de pourquoi vous pensez que quelque chose sera dans un groupe de recherche particulier – DataNucleus

+0

@DataNucleus Je ne le veux pas dans un groupe de récupération particulier mais dans celui par défaut. Mon problème est que je peux récupérer la classe ElementOne dans mon second exemple mais dans la troisième, quand j'annote deux clés primaires, j'obtiens un 'java.lang.NoSuchFieldError' sur elementOne. – Jla

+0

Oui, mais vous ne fournissez pas votre classe PK, aucun commentaire n'est possible – DataNucleus

Répondre

0

Grâce aux commentaires de l'utilisateur DataNucleus et à la documentation du site officiel, voici ce qui me manquait.

ElementOne a besoin d'un PrimaryKey class afin que nous puissions use a constructor accepting a string argument dans la classe primaire PrimaryKey.

classe ElementOne PrimaryKey:

public static class PK implements Serializable 
{ 
     public Long idElementOne; 

     public PK() 
     { 
     } 

     public PK(String s) 
     { 
      this.idElementOne = Long.valueOf(s); 
     } 

     public String toString() 
     { 
      return "" + idElementOne; 
     } 

     //... 
    } 

classe principale avec sa classe PrimaryKey:

@PersistenceCapable(objectIdClass=PK.class) 
public class MainClass{ 

@PrimaryKey 
@Column(name = idElementOne, allowsNull = "false") 
private ElementOne elementOne; 

@PrimaryKey 
@Column(name = "idElementTwo", allowsNull = "false"); 
private Long idElementTwo; 

//... 

public static class PK implements Serializable 
{ 
     public Long idElementTwo; // Same name as real field in the main class 
     public ElementOne.PK elementOne; // Same name as the real field in the main class 

     public PK() 
     { 
     } 

     public PK(String s) 
     { 
      String[] constructorParam = s.split("::"); 
      this.idElementTwo= Long.parseLong(constructorParam[1]); 
      this.personne = new Personne.PK(constructorParam[2]); 

     } 

     public String toString() 
     { 
      return "" + idElementTwo+ "::" + this.personne.toString(); 
     } 

     //... 
    } 
} 

PS: Exemples de site DataNucleus utilisation StringTokenizer qui est not implemented in GWT, utilisez String.split() à la place. De plus, le doc java indique que:

StringTokenizer est une classe héritage qui est retenu pour des raisons de compatibilité bien que son utilisation est déconseillée dans le nouveau code . Il est recommandé que quiconque recherche cette fonctionnalité utilise la méthode split de String ou le package java.util.regex à la place.