2

次のテーブルがあります。

@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>>

Hibernateでどうすればできますか?

4

3 に答える 3

6

州のクラスで取得map<key, Set<value>>したいMap<Event, Set<StateEventAction>>

Hibernateは、リストのリスト、セットのマップなどのコレクションのコレクションをすぐにサポートしていません。UserCollectionTypeただし、独自に実装して、この種のデータ構造のサポートを追加することもできます。このブログ投稿MultiMapは、 Apachecommonsの実装を使用してこれを行う方法を示しています。

私の提案は、同様のアプローチを使用することですが、おそらくGoogleGuavaMultimapから生成されたものを好むでしょう。

于 2010-11-17T11:36:21.323 に答える
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;
于 2010-11-17T11:03:49.800 に答える
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);
}
于 2010-11-17T09:00:26.797 に答える