休眠地图<key,set <value =“”>&gt; </key,>

时间:2010-11-17 08:44:22

标签: java hibernate hibernate-mapping

我有以下表格:

@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中完成?

3 个答案:

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