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?

Foi útil?

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>> do Map<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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top