2011-03-08 5 views
3

J'ai une structure de données qui se résume à:JPA Carte des cartes

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

Pour essayer de faire la JPA2 annotations un peu plus sain d'esprit que j'ai créé petite classe pour représenter la classe interne:

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

ce qui me donne:

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

ce que je voudrais à la fin est une structure de table qui ressemble à:

SS_USER_PREFS 
    PREFS_ID 
    DESC 

SS_LAYOUT_ATTRS 
    PREFS_ID 
    NODE_ID 
    NAME 
    VALUE 

Cependant, je ne suis pas vraiment sûr de savoir comment procéder pour mapper JPA. Il semble que je souhaite que LayoutAttributeImpl soit incorporable, mais pour autant que je sache, les objets Embeddable ne peuvent pas contenir de collections. Je l'ai maintenant travailler avec LayoutAttributeImpl agissant comme un @Entity à part entière, mais cela me donne une table supplémentaire dont je n'ai vraiment pas besoin.

Répondre

1

Comment quelque chose comme:

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

class AttributeCoordinate { 
    String nodeID; 
    String prefID; 
} 

Google Maps est très sur les tables sans détour que vous voulez - intégrables peuvent être des clés dans les cartes, à droite? Si vous recherchez toujours des attributs avec un nœud et un ID de préférence en même temps, vous pouvez masquer cette structure d'objet un peu bizarre à l'intérieur du getter.

Si vous voulez pouvoir manipuler des cartes entières des attributs d'un nœud individuel, vous avez un problème. Vous pouvez écrire une implémentation de Map qui la simule: elle contient un ID de nœud et gère les recherches en traitant la clé comme un ID de préférence, puis en effectuant une recherche avec la paire.

Cela a-t-il un sens? Je viens de manger beaucoup de crêpes, et il est possible que je ne pense pas directement.

+0

Cela a du sens. Je suis en cours de refactoring mais je vais essayer dès que je le pourrai. Je cache déjà les attributs de la carte via des méthodes d'accesseur, donc cacher la clé de carte bizarre devrait être faisable. Je serai sûr de marquer la réponse comme acceptée une fois que je l'ai testé. J'espère que les crêpes étaient bonnes. – Eric

+2

Cela a fonctionné, j'ai utilisé une méthode @PostLoad pour vider cette carte dans la carte >, car le code client doit faire beaucoup de recherche par nodeId pour les données connexes. Merci encore pour votre aide! – Eric

+0

Déplacement ingénieux avec le @PostLoad. –

Questions connexes