Hibernate映射<键,值集合>。

3

我有以下数据表:

@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<Event,set<StateEventAction>>map<key,set<value>>。我应该如何在Hibernate中实现?
3个回答

6
我希望在状态类中获取Map<Event,Set<StateEventAction>>map<key,Set<value>>。Hibernate不支持开箱即用的集合嵌套,如列表的列表、映射的集合等。但是,您可以实现自己的UserCollectionType以支持这种数据结构。这个博客文章展示了如何使用Apache commons的MultiMap实现来实现这一点。我的建议是使用类似的方法,但可能更喜欢Google Guava的泛型Multimap

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;

1

您可能需要首先查询状态的所有StateEventAction对象,然后编写自己的代码,以创建事件集(如果尚未创建),然后将StateEventAction对象添加到该集中。

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接