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:
- Ich kann nicht Frühling Anmerkungen an die Basisklasse (aber ich kann
Thing
Unterklasse und mit Anmerkungen versehen, dass). - Ich möchte das Feld
name
als Mongodb eindeutige ID verwenden (vor allem, um die Erstellung eines separaten eindeutigen Index dafür zu vermeiden). - 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?
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
@ 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
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