hibernar mapa >
-
25-09-2019 - |
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?
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>>
deMap<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);
}