JPA Карта на картите

Имам структура от данни, която се свежда до:

class StylesheetUserPreferencesImpl {
    long id;
    String desc;
    Map<String, Map<String, String>> nodeAttributes;
}

За да опитам да направя анотациите на JPA2 малко по-разумни, създадох малък клас, за да представя вътрешния клас:

class LayoutAttributeImpl {
    String nodeId;
    private Map<String, String> attributes;
}

Което ми дава:

class StylesheetUserPreferencesImpl {
    long id;
    String desc;
    Map<String, LayoutAttributeImpl> nodeAttributes;
}

Това, което бих искал в крайна сметка, е структура на таблица, която изглежда така:

SS_USER_PREFS
    PREFS_ID
    DESC

SS_LAYOUT_ATTRS
    PREFS_ID
    NODE_ID
    NAME
    VALUE

Все пак не съм много сигурен как да картографирам това в JPA. Изглежда, че искам LayoutAttributeImpl да бъде Embeddable, но доколкото разбирам, Embeddable обектите не могат да съдържат колекции. Работи ми в момента с LayoutAttributeImpl, действащ като пълноправен @Entity, но това ми дава допълнителна таблица, която наистина не ми трябва.


person Eric    schedule 08.03.2011    source източник


Отговори (1)


Какво ще кажете за нещо като:

class StylesheetUserPreferencesImpl {
    long id;
    String desc;
    Map<AttributeCoordinate, String> attributes;
}

class AttributeCoordinate {
    String nodeID;
    String prefID;
}

Това се картографира много директно върху масите, които желаете - Embeddables могат да бъдат ключове в картите, нали? Ако винаги търсите атрибути както с възел, така и с идентификатор на предпочитание едновременно, тогава можете да скриете тази малко странна обектна структура в гетъра.

Ако искате да можете да манипулирате цели карти на атрибутите на отделен възел, имате проблем. Бихте могли да напишете имплементация на Map, която го фалшифицира: тя съдържа ID на възел и обработва справки, като третира ключа като ID на предпочитание, след което прави търсене с двойката от тях.

Има ли смисъл от това? Току-що изядох много палачинки и е възможно да не мисля трезво.

person Tom Anderson    schedule 08.03.2011
comment
Има смисъл. В момента съм по средата на друг рефакторинг, но ще опитам това веднага щом мога. Вече крия картата на атрибутите чрез методи за достъп, така че скриването на странния ключ за карта трябва да е осъществимо. Ще отбележа отговора като приет, след като го тествам. Дано палачинките са били добри. - person Eric; 10.03.2011
comment
Проработи, използвах метод @PostLoad, за да изхвърля тази карта в Map‹String, Map‹String, String››, тъй като кодът на клиента трябва да направи много търсене само чрез nodeId за свързаните данни. Благодаря отново за помощта! - person Eric; 10.03.2011
comment
Гениален ход с @PostLoad. - person Tom Anderson; 10.03.2011