Domanda

Ho le seguenti tabelle:

@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

vorrei in classe state per ottenere map<key, set<value>> di Map<Event, set<StateEventAction>>

Come posso farlo in Hibernate?

È stato utile?

Soluzione

Se si desidera ricevere Mappa di set, vuol dire che ci sono diverse azioni per ogni azione (state_id, event_id). In modo da avere mappature dell'entità sbagliato. Dovrebbe essere

@Entity 
@Table(name = "state_event_action") 
StateEventAction 
--id 
--state_id 
--event_id 
--Set<action> actions

In questo caso è possibile scrivere:

@Entity @Table(name = "state")     
State 
    --id 
    --name 
 Map<Event,StateEventAction> eventActions;

Altri suggerimenti

  

vorrei in classe Stato per ottenere map<key, Set<value>> di Map<Event, Set<StateEventAction>>

Hibernate non supporta collezione di collezioni, come lista di liste, Mappa di assortimenti, ecc fuori dalla scatola. Ma è possibile implementare il proprio UserCollectionType per aggiungere il supporto per questo tipo di struttura dati. Questo post sul blog mostra come farlo utilizzando il MultiMap implementazione da Commons Apache.

Il mio suggerimento sarebbe quello di utilizzare un approccio simile, ma forse a preferire il generified Multimap da Google Guava.

Si avrà probabilmente bisogno di prima interrogazione tutto lo StateEventAction oggetti per lo stato quindi scrivere il proprio codice per creare prima un set per l'evento se non è già creato quindi aggiungere l'obejct StateEventAction al set.

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top