我有以下表格:
@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>>
的{{1}}
如何在Hibernate中完成?
答案 0 :(得分:6)
我希望在州级课程中获得
的map<key, Set<value>>
Map<Event, Set<StateEventAction>>
Hibernate不支持收集列表列表,集合映射等集合。但您可以实现自己的UserCollectionType
来添加对此类数据结构的支持。这个blog post显示了如何使用Apache commons的MultiMap
实现。
我的建议是使用类似的方法,但也许更喜欢Google Guava中的格式Multimap
。
答案 1 :(得分:2)
如果要接收集合映射,则表示每个(state_id,event_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;
答案 2 :(得分:1)
您可能需要先查询状态的所有StateEventAction对象,然后编写自己的代码,首先为事件创建一个集合(如果尚未创建),然后将StateEventAction 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);
}