mapa de hibernato >
-
25-09-2019 - |
Pergunta
Eu tenho as seguintes tabelas:
@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
Eu gostaria em state
classe para obter map<key, set<value>>
do Map<Event, set<StateEventAction>>
Como posso fazer isso em Hibernate?
Solução
Se você deseja receber o mapa dos conjuntos, isso significa que existem várias ações para cada ação (State_Id, Event_ID). Então você tem mapeamentos da entidade errada. Deveria ser
@Entity
@Table(name = "state_event_action")
StateEventAction
--id
--state_id
--event_id
--Set<action> actions
Nesse caso, você pode escrever:
@Entity @Table(name = "state")
State
--id
--name
Map<Event,StateEventAction> eventActions;
Outras dicas
Eu gostaria na classe estadual para conseguir
map<key, Set<value>>
doMap<Event, Set<StateEventAction>>
O Hibernate não suporta a coleta de coleções, como lista de listas, mapa de conjuntos, etc. Mas você pode implementar o seu próprio UserCollectionType
Para adicionar suporte a esse tipo de estrutura de dados. este Postagem do blog mostra como fazer isso usando o MultiMap
Implementação do Apache Commons.
Minha sugestão seria usar uma abordagem semelhante, mas talvez preferir o generificado Multimap
Do Google Guava.
Você provavelmente precisará primeiro consultar todos os objetos do StateEventAction para o estado e, em seguida, escrever seu próprio código para primeiro criar um conjunto para o evento, se ainda não for criado.
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);
}