2017-06-28 2 views
1

Ich habe einen Allzweck- POJO:Get spring-data-mongodb zu Ehren Getter/Setter ohne Hintergrundfeld?

public class Thing { 
    private String name; 
    private String etc; 

    public String getName() { 
     return name; 
    } 
    // other getters and setters 
} 

ich mit Spring 4.3.9 und Spring-data-mongodb 1.10.4. Ich möchte in MongoDB Instanzen dieser POJO speichern, aber ich habe einige Einschränkungen:

  1. Ich kann nicht Frühling Anmerkungen an die Basisklasse (aber ich kann Thing Unterklasse und mit Anmerkungen versehen, dass).
  2. Ich möchte das Feld name als Mongodb eindeutige ID verwenden (vor allem, um die Erstellung eines separaten eindeutigen Index dafür zu vermeiden).
  3. Ich möchte (redundant) das Feld name als ein tatsächliches Feld namens "Name" speichern, so dass andere Verbraucher der Sammlung nicht wissen müssen, dass "Name" in der _id gespeichert ist.

Ich begann diese versuchen:

public class SpringThing extends Thing { 
    @Id 
    @Override 
    public String getName() { 
     return super.getName(); 
    } 
    @Override 
    public void setName(String name) { 
     super.setName(name); 
    } 
} 

Diese Feder bewirkt, dass der Wert von name für _id, aber natürlich verwenden, es erfolgt keine Speicherung auf ein Feld in MongoDB dem Namen „name“. The documentation sagt, dass Frühjahr eine "Eigenschaft oder Feld" namens "ID" oder mit @Id annotiert verwenden wird. Also habe ich versucht, eine redundante Getter/Setter definiert, die das Namensfeld zugreift:

public class SpringThing extends Thing { 
    @Id 
    public String getId() { 
     return super.getName(); 
    } 
    public void setId(String id) { 
     super.setName(id); 
    } 
} 

Leider Frühling ignoriert getId und setId hier und speichert das Objekt mit einer automatisch generierten ID. Ich habe auch versucht, redundante Getters/Setter mit @Field("name") kommentiert, aber Frühling scheint zu ignorieren, Getter/Setter-Paar ohne ein tatsächliches Feld.

ein tatsächliches ID-Feld Hinzufügen und eine Kopie des Namen dort Speicherung funktioniert:

public class SpringThing extends Thing { 
    @Id 
    private String id; 

    @Override 
    public void setName(String id) { 
     this.id = id; 
     super.setName(id); 
    } 
} 

aber es erfordert eine sinnlose Feld mit dem Namen „id“ zu definieren.

Gibt es einen vernünftigeren Weg, um zu bekommen, was ich will? Ist das, was ich versuche, vernünftig zu beginnen?

+0

Haben Sie versucht, das Hinzufügen [ '@ AccessType'] (http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/annotation/AccessType.html) zu deiner Frühlingsspezifischen Klasse? Alternativ können Sie die Klasse speichern, die Sie nicht als verschachteltes Dokument ändern können, wenn dieses Muster für Sie funktioniert. – mp911de

+0

@ mp911de Ich war mir der AccessType-Annotation nicht bewusst. Ich habe versucht, es zum getId/setId Versuch hinzuzufügen, und es hat den gewünschten Effekt - spring verwendet getId/setId für die eindeutige ID. Wenn du das als Antwort schreibst, werde ich es akzeptieren. – Kenster

+0

Möchten Sie eine Antwort hinzufügen, wenn Sie eine Lösung gefunden haben? Wäre sehr nützlich, um ein vollständiges Beispiel zu sehen. – woemler

Antwort

0

Dank einem Hauch von @ mp911de ich eine Unterklasse von Thing Schaffung endete die wie folgt aussieht:

@TypeAlias("thing") 
@Document(collection = "things") 
public class SpringThing extends Thing { 

    @Id 
    @AccessType(Type.PROPERTY) 
    @JsonIgnore 
    public String getId() { 
     return super.getName(); 
    } 

    public void setId(String taskName) { 
     super.setName(taskName); 
    } 
} 
  • Die @TypeAlias Anmerkung überschreibt den Namen, die Feder für den Typ verwenden würde, abzudecken up die Tatsache, dass ich eine Unterklasse erstellt habe, nur um Anmerkungen hinzuzufügen.
  • @Id sagt, dass dies der Getter für _id ist.
  • @AccessType sagt, auf dieses Feld durch den Getter und Setter zugreifen, anstatt durch direkten Zugriff auf das Feld. Das habe ich gebraucht; Ohne es sucht Frühling nach einer privaten Mitgliedsvariablen, die wie id benannt wird.
  • @JsonIgnore ist die Jackson (JSON-Bibliothek, die wir verwenden) Annotation zu verhindern, dass die id Feld bei der Serialisierung dieser Objekte zu JSON.
Verwandte Themen