2013-04-23 5 views
0

Я пытаюсь сохранить объект JPA с коллекцией настраиваемых объектов @Embeddable, используя аннотацию JPA2 @ElementCollection. Простой пример (оба класса усиливается DataNucleus):Сохранение @ElementCollection @Embeddable (Google App Engine, datanucleus)

@Entity 
public class TestEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @ElementCollection 
    private Set<TestEmbeddable> testEmbeddables; 

    public Set<TestEmbeddable> testEmbeddables() { 
     return this.testEmbeddables; 
    } 
} 

@Embeddable 
public class TestEmbeddable implements Serializable { 
    public String s; 
} 

сохраненного Datastore сущность, однако, будет содержать только набор нулевых значений вместо реальных объектов:

TestEntity.testEmbeddables = [null, null, ...] 

сохраняющегося коллекцию основные типы, такие как строки или встраивание одного объекта TestEmbeddable с использованием @Embedded, отлично работают. Кто-нибудь сможет выяснить, поддерживаются ли коллекции элементов встраиваемых данных datanucleus-appengine?

В то время как раздел datanucleus на JPA element collections дает только пример для коллекции String, соответствующий JDO section использует собственный тип встроенного типа. В feature list далее говорится, что встроенные коллекции в целом совместимы с GAE, но не говорят, поддерживаются ли настраиваемые типы. Я также нашел другого человека, утверждающего, что this should work.

- Edit -

После ответа DataNucleus', я побежал еще несколько тестов:

@ElementCollection 
private List<String> stringsElementCollection; 

-> Работы. Отдельные строки, сохраняются в TestEntity.stringsElementCollection = [str1, str2, ...]

@Embedded 
private List<String> stringsEmbedded; 

-> То же, что @ElementCollection. Интересно, относится ли спецификация JPA к использованию @Embedded в коллекции?

@ElementCollection 
private List<TestEmbeddable> embeddablesElementCollection; 

-> Не работает. Вместо реальных TestEmbeddable объектов, хранилище данных сохраняется только набор нулевых значений: TestEntity.embeddablesElementCollection = [NULL, NULL, ...]

@Embedded 
private List<TestEmbeddable> embeddablesEmbedded; 

-> Это похоже на работу. Поле TestEmbeddable.s хранится как TestEntity.s.0, .s.1 и т. Д. Плюс свойство TestEntity.embeddablesEmbedded.size.

(SDK App Engine 1.7.7.1, DataNucleus 3.1.3, DataNucleus-AppEngine 2.1.2)

+0

Вы пробовали https://code.google.com/p/objectify-appengine/. Этот API инкапсулирует много вещей для вашего развития. –

ответ

0

Никакая идея, если поддержка Google встроенные коллекции таких объектов еще с JPA. Это было разработано только для JDO и работает там. Вы можете попробовать поставить @Embedded на встроенное поле, чтобы укрепить идею о том, что его встроенный.

+0

Спасибо за подсказку! Хотя объединение '@ Embedded' и' @ ElementCollection' не работает, работает только '@ Embedded', хотя я не уверен в том, как это должно быть. См. Выше результаты - похоже ли это на вас? Что касается поддержки Google, о которой вы упоминали, нужно ли предоставлять datanucleus-appengine для явной поддержки JPA? Я думал, что DataNucleus абстрагируется от уровня JDO/JPA и что datanucleus-appengine «only» переводит функциональность DataNucleus для хранилища данных, независимо от того, используется ли JDO или JPA ... –

+0

Кроме того, я просто заметил, что реализация JPA (возможно, то же самое для JDO?), по-видимому, не будет отслеживать изменения в коллекциях встраиваемых объектов с '@ Embedded', а также с' @ Lob', если явно не помечены как грязные. Он работает для строк, хотя ('@ ElementCollection' и' @ Embedded'). –

+0

Да, их плагин должен использовать некоторые вещи в метаданных, которые есть только в JPA. Единственное, что можно сказать, это использовать последнюю версию SVN своего плагина (так как это не было выпущено за какое-то время и может или не может повлиять на вещи), и при возникновении проблем вы сообщаете об этом в свой трекер ошибок https: // code.google.com/p/datanucleus-appengine/, поскольку Google, вероятно, не заботится о мониторинге какого-либо тега Stackoverflow – DataNucleus

Смежные вопросы