2010-12-06 9 views
0

複合キーを持つクラスをデータ核にマッピングしようとしています。主キーは2つの外部キーで構成されていると私はfetchgroupでこれらの外国人のクラスを含めることができるように見えることはできません。アノテーションを使用Datanucleus fetchgroup複合キー

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

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

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

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

作品を作品

しかし

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

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

はありません。

どうすればいいですか?

+0

フェッチグループのメタデータやフェッチグループAPIの使用については言及していません。なぜ特定のフェッチグループに何かがあると思うのか分かりません。 – DataNucleus

+0

@DataNucleus私は特定のフェッチグループではなくデフォルトのフェッチグループにしたくありません。私の問題は、2番目の例でElementOneクラスを取得できますが、3番目に2つの主キーに注釈を付けると、elementOneに 'java.lang.NoSuchFieldError'が追加されます。 – Jla

+0

はい、PKクラスを提供していないので、コメントはありません – DataNucleus

答えて

0

DataNucleusのユーザーからのコメントと、公式のWebサイトからのドキュメントのおかげで、私は欠けていたものがあります。

ElementOneにはPrimaryKey classが必要です。したがって、メインクラス 'PrimaryKeyにuse a constructor accepting a string argumentを追加することができます。

ElementOne主キークラス:その主キークラスと

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; 
     } 

     //... 
    } 

メインクラス:

@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:not implemented in GWTあるDataNucleusのウェブサイトの使用StringTokenizerからの例として、代わりに)(のstring.Splitを使用しています。

はStringTokenizerは、その使用が新 コードで推奨されているが は、互換性の理由のために保持されていることをレガシークラスです。またJavaのドキュメントは、と述べています 誰でもこの機能を使用するには、 文字列分割メソッドまたは java.util.regexパッケージを使用することをお勧めします。