Pregunta

Tengo las siguientes tablas:

@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

Me gustaría en clase state para obtener map<key, set<value>> de Map<Event, set<StateEventAction>>

¿Cómo puedo hacer que en Hibernate?

¿Fue útil?

Solución

Si desea recibir Mapa de conjuntos, significa que hay varias acciones para cada uno de las acciones (state_id, event_id). Por lo que tiene asignaciones de entidad mal. Debe ser

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

En este caso se puede escribir:

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

Otros consejos

  

Me gustaría en la clase de estado para obtener map<key, Set<value>> de Map<Event, Set<StateEventAction>>

Hibernate no soporta la colección de colecciones como la Lista de Listas, Mapa de conjuntos, etc fuera de la caja. Pero se podría implementar su propio UserCollectionType para añadir soporte para este tipo de estructura de datos. Este blog muestra cómo hacerlo a través de la MultiMap aplicación de bienes comunes de Apache.

Mi sugerencia sería utilizar un enfoque similar, pero tal vez a preferir el generified Multimap de Google guayaba.

Usted probablemente necesitará primera consulta todos los objetos StateEventAction para el estado y luego escribir su propio código para crear primero un conjunto para el evento si no se ha creado a continuación, añadir el obejct StateEventAction al conjunto.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top