Что на самом деле делает аннотация @Embedded в Morphia?
При написании документов в Mongodb
с помощью Morphia
такая структура будет написана без проблем и без необходимости @Embedded
аннотация:
@Entity
public class Blog {
@Id
private String id;
private List<Comment> comments;
}
comments
поле счастливо хранится как массив вложенных Comment
элементы (Comment
простой POJO без аннотаций).
Тем не менее Morphia
документация предполагает, что я должен использовать это:
@Entity
public class Blog {
@Id
private String id;
@Embedded
private List<Comment> comments;
}
Но в моих тестах с использованием @Embedded
аннотация, кажется, не делает ничего дополнительного по сравнению с простым написанием структуры без аннотации.
Так что же @Embedded
аннотации на самом деле делать? Влияет ли это на способность запрашивать или индексировать, или на какую-либо другую функцию хранения, отличную от простой записи данных?
2 ответа
Serializable
обычно не используется с Morphia. @Embedded
это немного неоднозначный предмет, чье первоначальное намерение, похоже, потеряно. На самом деле, в моей развилке, над которой я работаю над официальной версией 2.0 Morphia, я ограничил ее так, чтобы она применялась только на уровне класса. Это говорит Morphia, чтобы отобразить тип, но не потерпеть неудачу при отображении отсутствующего @Id
аннотаций. В этой ветке, если вы хотите указать имя, отличное от имени поля, вы просто используете @Property
как и для любых не встроенных типов.
Надеюсь, это прояснит это хотя бы немного.
Как правило, вы должны @Embedded
для объектов, которые зависят от родительского объекта (и, следовательно, не имеют жизни вне его) и не являются общими для объектов.
По умолчанию Morphia использует имя поля в качестве имени значения в Mongo. Это можно переопределить, указав имя в аннотации @Embedded:
@Embedded("blog_comments")
private List<Comment> comments;
Даже без @Embedded
вы все еще можете использовать Java-класс в качестве типа поля, если этот класс реализует java.io.Serializable
, Однако это поле будет храниться в MongoDB в двоичном формате вместо структурированных данных, как показано выше.