182 votes

Comment conserver une propriété de type List<String> dans JPA ?</String>

Quelle est la façon la plus intelligente pour obtenir une entité avec un champ de type que liste a persisté ?

Command.Java


Copiez le code suivant génère :

218voto

L'utilisation de certains JPA 2 mise en œuvre: il ajoute un @pour valeur elementcollection annotation, similaire à l'Hibernation, qui fait exactement ce dont vous avez besoin. Il y a un exemple ici: lien texte.

Modifier

Comme mentionné dans les commentaires ci-dessous, le bon JPA 2 mise en œuvre est

javax.persistence.ElementCollection

@ElementCollection
Map<Key, Value> collection;

Voir: http://docs.oracle.com/javaee/6/api/javax/persistence/ElementCollection.html

31voto

Bill James Points 7554

Des listes d'objets à l'intérieur d'un objet de modèle sont généralement considérés comme "OneToMany" les relations avec un autre objet. Toutefois, une Chaîne n'est pas (par lui-même) déductible au titre d'un client de l'Un-à-Plusieurs relation, qu'elle n'a pas un ID.

Donc, vous devez convertir votre liste de Chaînes pour une liste de l'Argument de la classe JPA objets contenant un IDENTIFIANT et d'un String. Vous pouvez éventuellement utiliser la Chaîne comme l'identité, ce qui permettrait d'économiser un peu d'espace dans votre tableau à la fois de supprimer le champ ID et en consolidant les lignes où les Chaînes sont égales, mais vous perdrez la possibilité de commander les arguments de retour dans leur ordre d'origine (que vous n'avez pas de stocker toutes les informations concernant la commande).

Sinon, vous pouvez convertir votre liste de @Transitoire et ajouter un autre champ (argStorage) à votre classe est un VARCHAR() ou CLOB. Vous devrez ensuite ajouter 3 fonctions: 2 d'entre eux sont les mêmes et devez convertir votre liste de Chaînes de caractères dans une Chaîne unique (dans argStorage) délimité d'une façon que vous pouvez facilement séparer. Annoter ces deux fonctions (qui font chacun la même chose) avec @PrePersist et @PreUpdate. Enfin, ajouter la troisième fonction qui divise le argStorage dans la liste de Chaînes, nouveau et annotation @test de charge. Cela permet de garder votre CLOB mis à jour avec les cordes à chaque fois que vous allez au magasin de la Commande, et de garder la argStorage champ mis à jour avant de les stocker à la DB.

J'ai toujours penser à faire le premier cas. C'est une bonne pratique pour de vrai relations par la suite.

15voto

toolkit Points 27248

Selon Java persistance avec Hibernate

cartographie des collections de types valeur avec des annotations [...]. Au moment de l’écriture, il n’est pas partie de la norme Java Persistence

Si vous utilisiez mise en veille prolongée, vous pourriez faire quelque chose comme :

Mise à jour : Notez, c’est maintenant disponible en JPA2.

10voto

Anthony Points 682

J’ai eu le même problème, donc j’ai investi la solution donnée, mais à la fin, j’ai décidé de mettre en œuvre ma liste des « ; » séparés de la chaîne.

J’ai donc

De cette façon, la liste est facilement lisible/modifiable dans la table de base de données ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X