hibernate mappa >
-
25-09-2019 - |
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?
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>>
diMap<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);
}