Convertir la liste de l'entité à chaîne unique de la colonne dans la base de données
J'ai un VARCHAR
champ dans ma base de données, et la valeur de ce champ est val1,val2,val3
.
Est-il possible de mettre cela en un ArrayList<String>
attribut d'une entité à l'aide de la virgule comme split délimiteur?
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez JPA 2.1, vous pouvez créer un
AttributeConverter
:Vous pouvez utiliser ce convertisseur dans votre entité:
Avant JPA 2.1 vous pouvez le faire à la main:
J'envelopper
Arrays.asList
dans unArrayList
dans le convertisseur, parce que le résultat est stocké dans l'attribut et toute modification de cette liste seront écrites dans la base de données - donc j'ai besoin d'une variable de la liste (je ne peux pas ajouter quoi que ce soit à la suite deArrays.asList
). Dans le avant 2.1 solution le résultat n'est pas connecté avec l'attribut et une variable de liste serait ne pas être synchronisées avec l'attribut.À la requête pour une entité qui contient un élément spécifique dans un tel attribut, voir ma réponse here
Oui, c'est possible.
Avec Hibernate 4.3.x+ vous pouvez définir un
AttributeConverter
bien que je suis sûr que cela ne fonctionnera pas pour le début de l'Hibernation des versions en raison de laList
type. Voir pour un exemple: http://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/L'autre façon de faire de ce travail est de mettre en œuvre une coutume
UserType
et en annotant le champ/getter avecorg.hibernate.annotations.Type
. Voici une belle écriture de ce avec des exemples: http://blog.xebia.com/understanding-and-writing-hibernate-user-types/Encore une autre façon qui est JPA compatible est d'avoir deux champs, le
List
annoté avecjavax.persistence.Transient
et laString
, mais alors vous devez gérer l'état de synchronisation entre ces deux champ dansPrePersist
etPreUpdate
auditeurs vous-même. Voici un exemple d'utilisation d'écouteurs: http://alexandregama.org/2014/03/23/entity-listeners-and-callback-methods-jpa/Essayez d'utiliser @pour valeur elementcollection et @CollectionTable annotations