Hibernate Karte >
-
25-09-2019 - |
Frage
Ich habe die folgenden Tabellen:
@Entity
@Table(name = "events")
Event
--id
--name
@Entity
@Table(name = "state")
State
--id
--name
@Entity
@Table(name = "action")
Action
--id
--name
@Entity
@Table(name = "state_event_action")
StateEventAction
--id
--state_id
--event_id
--action_id
Ich würde in state
Klasse wie map<key, set<value>>
von Map<Event, set<StateEventAction>>
zu bekommen
Wie kann ich es in den Ruhezustand zu tun?
Lösung
Wenn Sie Karte von Sätzen empfangen wollen, bedeutet dies, dass es mehrere Aktionen für jeden (state_id, event_id) Aktionen. So haben Sie Zuordnungen der falschen Einheit. Es sollte sein
@Entity
@Table(name = "state_event_action")
StateEventAction
--id
--state_id
--event_id
--Set<action> actions
In diesem Fall können Sie schreiben:
@Entity @Table(name = "state")
State
--id
--name
Map<Event,StateEventAction> eventActions;
Andere Tipps
Ich würde in Zustandsklasse wie
map<key, Set<value>>
vonMap<Event, Set<StateEventAction>>
zu bekommen
Hibernate nicht Sammlung von Sammlungen wie Liste der Listen, Karte von Sets unterstützen, usw. aus dem Kasten heraus. Aber Sie könnten Ihre eigenen UserCollectionType
implementieren für diese Art von Datenstruktur, um Unterstützung. Dieser Blogeintrag zeigt, wie dies zu tun, die mit MultiMap
Implementierung von Apache commons.
Mein Vorschlag einen ähnlichen Ansatz zu verwenden wäre, aber vielleicht lieber das generified Multimap
von Google Guava.
Sie werden wahrscheinlich brauchen, um erste Abfrage alle StateEventAction Objekte für den Staat dann Ihren eigenen Code schreiben, um zunächst einen Satz für den Fall zu erstellen, wenn nicht bereits erstellt dann die StateEventAction obejct dem Satz hinzuzufügen.
State state = // < the state object;
Query q = Session.createQuery("from StateEventAction sea inner join fetch sea.event where sea.state = :state");
q.setEntity("state", state);
Map<Event, Set<StateEventAction>> map = new HashMap<Event, Set<StateEventAction>>();
for(Iterator itr = q.list().iterator(); itr.hasNext();) {
StateEventAction sea = itr.next();
Event event = sea.getEvent();
Set<StateEventAction> theSet = map.get(event);
if(theSet == null) {
theSet = new HashSet<StateEventAction>();
map.put(event, theSet);
}
theSet.add(sea);
}