Вопрос

У меня есть следующие таблицы:

@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

Я хотел бы в state класс, чтобы получить map<key, set<value>> из Map<Event, set<StateEventAction>>

Как я могу сделать это в гибернации?

Это было полезно?

Решение

Если вы хотите получить карту наборов, это означает, что есть несколько действий для каждой (Dist_id, event_id_id) действий. Таким образом, у вас неверные сопоставления сущностей. Так должно быть

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

В этом случае вы можете написать:

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

Другие советы

Я хотел бы в государственном классе, чтобы получить map<key, Set<value>> из Map<Event, Set<StateEventAction>>

Hibernate не поддерживает коллекцию коллекций, таких как список списков, карты наборов и т. Д. Из коробки. Но вы могли бы реализовать свой собственный UserCollectionType Чтобы добавить поддержку такого рода структуру данных. Этот Сообщение блога показывает, как это сделать, используя MultiMap Реализация от Apache Commons.

Мое предложение было бы использовать аналогичный подход, но, возможно, для предпочтения извлеченного Multimap от Google Guava.

Вам, вероятно, понадобится сначала запросить все объекты в области государственной суммы для состояния, а затем напишите свой собственный код, чтобы сначала создать набор для события, если он еще не создан, а затем добавьте сложноеEventcentactionAction Obejct на набор.

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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top