Составной ключ Datanucleus fetchgroup - PullRequest
0 голосов
/ 06 декабря 2010

Я пытаюсь сопоставить класс с составным ключом в datanucleus. Первичный ключ состоит из двух внешних ключей, и я не могу включить эти внешние классы в группу fetch:

Использование аннотаций:

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

нет.

Как мне это сделать?

1 Ответ

0 голосов
/ 16 декабря 2010

Благодаря комментариям пользователя DataNucleus и документации с официального сайта, вот что мне не хватало.

ElementOne нужен класс PrimaryKey , чтобы мы могли использовать конструктор, принимающий строковый аргумент в основном классе 'PrimaryKey.

Класс 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;
        }

        //...
    }

Основной класс с классом 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: Примеры с сайта DataNucleus используют StringTokenizer , который не реализован в GWT , вместо этого используйте String.split (). Кроме того, в документе Java говорится, что:

StringTokenizer - это устаревший класс, который сохраняется по соображениям совместимости хотя его использование не рекомендуется в новых код. Рекомендуется, чтобы кто-нибудь ища эту функциональность использовать метод разделения строки или Вместо этого пакет java.util.regex.

...