2010-12-06 4 views
0

데이터 핵에 복합 키가있는 클래스를 매핑하려고합니다. 기본 키는 두 개의 외래 키 구성되어 있으며 나는 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 특정 페치 그룹에서는 아니지만 기본 페치 그룹에서는 필요하지 않습니다. 내 문제는 두 번째 예제에서는 ElementOne 클래스를 검색 할 수 있지만 세 번째에서는 두 개의 기본 키에 주석을 추가하면 elementOne에 java.lang.NoSuchFieldError가 표시된다는 것입니다. – Jla

+0

네, PK 클래스를 제공하지 않으므로 아무런 코멘트가 없습니다. – DataNucleus

답변

0

DataNucleus 사용자의 의견 및 공식 웹 사이트의 설명서 덕분에 제가 누락 된 부분이 있습니다.

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

     //... 
    } 

Main 클래스의 기본 키 클래스 :

@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.util.regex 패키지를 대신 사용하는 것이 좋습니다.