سؤال

لدي الجداول التالية:

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

كيف يمكنني فعل ذلك في السبات؟

هل كانت مفيدة؟

المحلول

إذا كنت ترغب في الحصول على خريطة مجموعات ، فهذا يعني أن هناك العديد من الإجراءات لكل إجراءات (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;

نصائح أخرى

أود الحصول على فئة الدولة map<key, Set<value>> من Map<Event, Set<StateEventAction>>

لا يدعم Hibernate جمع المجموعات مثل قائمة القوائم ، وخريطة المجموعات ، وما إلى ذلك خارج المربع. لكن يمكنك تنفيذ خاصتك UserCollectionType لإضافة دعم لهذا النوع من بنية البيانات. هذه مشاركة مدونة يوضح كيفية القيام بذلك باستخدام MultiMap تنفيذ من Apache Commons.

سيكون اقتراحي هو استخدام مقاربة مماثلة ، ولكن ربما تفضل تمويلها Multimap من Google Guava.

ربما ستحتاج إلى الاستعلام أولاً عن جميع كائنات StateEventAction للحالة ، ثم اكتب الكود الخاص بك لإنشاء مجموعة أولاً للحدث إذا لم يتم إنشاؤها بالفعل ، ثم أضف OBEJCT 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top