خريطة السبات <مفتاح ، تعيين >
-
25-09-2019 - |
سؤال
لدي الجداول التالية:
@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);
}