Kurze Antwort ist, dass Sie dies nicht tun können.
Aber hier ist Lösung für Ihr Problem geeignet sein kann:
In Einheit A noch definierte Beziehung zu Einheit B als Liste (oder sogar besser als Set, so dass die gleiche B nicht mehr als einmal enthalten sein).
@OneToMany(mappedBy="a")
private Set<B> bs;
Wie Sie wollen nicht auf die Ebene Liste belichten, lassen Sie Getter und Setter für as
.
Dann können Sie einen Getter definieren für Sie Karte, dass die Karte im laufenden Betrieb baut:
// a transient field to cache the map
private transient Map<String, B> bsMappedByCName;
public Map<String, B> getBsMappedByCName() {
if(bsMappedByCName == null) {
bsMappedByCName = new HashMap<String, B>();
for(B b : bs) {
mapB(b);
}
}
// return as unmodifiable map so that it is immutable for clients
return Collections.unmodifiableMap(bsMappedByCName);
}
private void mapB(B b) {
// we assume here that field c in class B and likely also field name in class C are not nullable. Further more both of this fields sould be immutable (i.e. have no setter).
if(bsMappedByCName.put(b.getC().getName(), b) != null) {
// multiple bs with same CName, this is an inconsistency you may handle
}
}
Das letzte Problem zu lösen ist, wie wir ein neues B nach A hinzufügen oder ein entfernen. Mit der Strategie, die Karte als nicht änderbar zurückzukehren, müssen wir einige Add- und Entferner Methoden in der Klasse A bieten:
public void addB(B b) {
bs.add(b);
mapB(b);
}
public void removeB(B b) {
bs.remove(b);
bsMappedByCName.remove(b.getC().getName());
}
Eine andere Möglichkeit ist, zu ersetzen return Collections.unmodifiableMap(...)
mit (inspiriert von ObservaleCollection from apache):
return new Map<String, B>() {
// implement all methods that add or remove elements in map with something like this
public B put(String name, B b) {
// check consistency
if(!b.getC().getName().equals(name)) {
// this sould be handled as an error
}
B oldB = get(name);
mapB(b);
return oldB;
}
// implement all accessor methods like this
public B get(String name) {
return bsMappedByCName.get(name);
}
// and so on...
};
Verwenden von Anmerkungen oder XML-Konfiguration? – skaffman
Der Fragetitel sagt Anmerkungen ... – Neuquino