Hibernate Map >
-
25-09-2019 - |
Вопрос
У меня есть следующие таблицы:
@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);
}