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?

War es hilfreich?

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>> von Map<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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top