carte mise en veille prolongée >
-
25-09-2019 - |
Question
Je les tableaux suivants:
@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
Je voudrais en classe state
pour obtenir map<key, set<value>>
de Map<Event, set<StateEventAction>>
Comment puis-je faire en veille prolongée?
La solution
Si vous souhaitez recevoir Carte des ensembles, cela signifie qu'il ya plusieurs actions pour chaque (state_id, event_id) actions. Vous avez donc des applications de mauvaise entité. Il devrait être
@Entity
@Table(name = "state_event_action")
StateEventAction
--id
--state_id
--event_id
--Set<action> actions
Dans ce cas, vous pouvez écrire:
@Entity @Table(name = "state")
State
--id
--name
Map<Event,StateEventAction> eventActions;
Autres conseils
Je voudrais en classe d'Etat pour obtenir
map<key, Set<value>>
deMap<Event, Set<StateEventAction>>
Hibernate ne supporte pas la collecte de collections telles que la liste des listes, Carte des jeux, etc de la boîte. Mais vous pouvez mettre en œuvre votre propre UserCollectionType
pour ajouter le support pour ce type de structure de données. Ce poste montre comment le faire en utilisant la MultiMap
mise en œuvre de Apache commons.
Ma suggestion serait d'utiliser une approche similaire, mais peut-être préférer la generified Multimap
de Google goyave.
Vous aurez probablement besoin d'abord interroger tous les objets StateEventAction pour l'état puis rédigez votre propre code d'abord créer un ensemble pour l'événement sinon déjà créé puis ajoutez le StateEventAction obejct à l'ensemble.
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);
}