Я использую способ справиться с этим. Не уверен, что это идеально, но это работает для меня.
Допустим, у вас есть эти классы
public class MyObject {
@Id
private String id;
private MyEmbeddedObject embeddedObject;
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public MyEmbeddedObject getEmbeddedObject() {
return this.embeddedObject;
}
public void setEmbeddedObject(MyEmbeddedObject embeddedObject) {
this.embeddedObject = embeddedObject;
}
}
public class MyEmbeddedObject {
@Id
private String id;
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
}
Вы хотите сохранить MyEmbeddedObject в коллекции "embed" и объект в коллекции "object" с ручной ссылкой на идентификаторы коллекции "embed". Например :
object : { id:1, embeddedObjectId: 99 }
embed : { id : 99 }
Вы можете реализовать собственный сериализатор и десериализатор для MyEmbeddedObject.
public class MyEmbeddedObjectSerializer extends JsonSerializer<MyEmbeddedObject> {
@Override
public void serialize(MyEmbeddedObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeText(value.getId());
}
}
public class MyEmbeddedObjectDeserializer extends JsonDeserializer<MyEmbeddedObject> {
@Override
public MyEmbeddedObject deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
MyEmbeddedObject obj = new MyEmbeddedObject();
obj.setId(jsonParser.getString());
return new MyEmbeddedObject();
}
}
Если вы зарегистрируете свой сериализатор в Jongo, проблема заключается в том, что он будет использоваться для MyEmbeddedObject как член MyObject, а также для MyEmbeddedObject, когда он хранится сам по себе в коллекции «встроить».
Чтобы применять пользовательские сериализаторы/десериализаторы только тогда, когда MyEmbeddedObject встроен в MyOBject, я использую аннотации Mixin.
public interface MyObjectMixIn {
@JsonSerialize(using=MyEmbeddedObjectSerializer .class)
public MyEmbeddedObject getEmbeddedObject();
@JsonDeserialize(using=MyEmbeddedObjectDeserializer.class)
public void setEmbeddedObject(MyEmbeddedObject embeddedObject);
}
Затем определите модуль
public class MyModule extends SimpleModule {
@Override
public void setupModule(SetupContext context) {
context.setMixInAnnotations(MyObject.class, MyObjectMixIn.class);
}
}
Наконец, зарегистрируйте модуль в Jongo.
Jongo jongo = new Jongo(db, JacksonMapper.Builder().registerModule(new MyModule ()).build());
Теперь, чтобы использовать его для хранения в Mongo
- Сохраните встроенный объект отдельно в коллекции «embed», чтобы получить идентификатор
- Убедитесь, что элемент embeddedObject объекта содержит идентификатор
- Сохраните объект в коллекции «объект». Будет сохранен только идентификатор встроенного объекта
И читать хранилище данных
- Прочитать объект из коллекции "object". Вложенный объект будет инициализирован только с его идентификатором
- Если вам это нужно, прочитайте встроенный объект в коллекции «вставить».
РЕДАКТИРОВАТЬ: чтобы избежать ленивой загрузки и загрузки всего объекта при десериализации, объект HandlerInstantiator от Jackson полезен для настройки сериализатора. и механизм построения десериализатора.
Надеюсь, это поможет.
person
Thomas
schedule
05.11.2013