MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb Java:Perist POJO-Klasse mit generischem Feld

Es gibt folgende Optionen, damit es funktioniert.

Durch Unterklassen

Wenn Sie jedes Mal eine Unterklasse mit einem konkreten generischen Typ erstellen, funktioniert es:

public class MyClassCacheEntity extends CacheEntity<MyClass> {}

Durch Verwendung von BsonDocument + Jackson

Um Unterklassen zu vermeiden, können Sie versuchen, beliebige Objekte als BsonDocument zu speichern -s und serialisieren/deserialisieren Sie sie mit Jackson:

public class CacheEntity<V> {
  private String cacheId;
  private BsonDocument rawValue;

  // [...]

  // sets the value
  public void withValue(T o) {
    this.rawValue = BsonDocument.parse(new ObjectMapper().writeValueAsString(o))
  }

  // recovers the value
  public T value(Class<T> clazz) {
    return new ObjectMapper().readValue(this.rawValue.toJson(), clazz);
  }
}

Dies funktioniert, bis Sie Getter/Setter-Konventionen für withValue() vermeiden und value() Methoden, sonst fängt Mongo an, sich über das gleiche Generika-Problem zu beschweren.

Dasselbe gilt für reines Bson

Ich denke, Sie können es auch mit org.bson.codecs.pojo.PojoCodec versuchen, dasselbe wie oben zu tun die Sie entweder erstellen oder aus der aktuellen Mongo-Codecs-Registrierung extrahieren können. Wenn Sie es im Voraus wissen und ihm die echte Klasse geben, sollte es sich nicht über Generika beschweren.