Я пытаюсь сохранить объект 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)
Вы пробовали https://code.google.com/p/objectify-appengine/. Этот API инкапсулирует много вещей для вашего развития. –