JPA collection de cartes de Enums
Est-il un moyen de JPA pour mapper une collection d'Énumérations au sein de la classe d'Entité? Ou la seule solution est d'envelopper Enum avec un autre domaine de la classe et de l'utiliser pour la carte de la collection?
@Entity
public class Person {
public enum InterestsEnum {Books, Sport, etc... }
//@???
Collection<InterestsEnum> interests;
}
Je suis de l'utilisation d'Hibernate JPA mise en œuvre, mais bien sûr, préférez la mise en œuvre agnostique solution.
Vous devez vous connecter pour publier un commentaire.
de l'utilisation d'Hibernate vous pouvez faire
Le lien Andy réponse est un excellent point de départ pour la cartographie des collections de "non-Entité" objets en JPA 2, mais ce n'est pas tout à fait terminée quand il s'agit de la cartographie des enums. Voici ce que j'ai trouvé à la place.
@ElementCollection
etCollection<InterestsEnum> interests;
Le reste est potentiellement utile, mais pas nécessaire. Par exemple@Enumerated(EnumType.STRING)
met lisible par l'homme des chaînes dans votre base de données.@Column
'sname
implicite. Je voulais juste préciser ce qui est implicite lors de l' @Colonne est omis. Et @Énumérée est toujours recommandé car ordinale est une chose terrible à défaut d'. 🙂@CollectionTable(name="person_interest", joinColumns = {@JoinColumn(name="person_id")})
J'ai été capable de faire cela de cette façon simple:
Désireux de chargement est nécessaire afin d'éviter le chargement paresseux inizializing erreur comme expliqué ici.
Je suis à l'aide d'une légère modification de java.util.RegularEnumSet avoir une persistance de la EnumSet:
Cette classe est maintenant la base de l'ensemble de mes enum définit:
Et que l'ensemble je peux utiliser dans mon entité:
Avantages:
java.util.EnumSet
pour une description)Inconvénients:
RegularEnumSet
etPersistentEnumSet
sont presque les mêmes)EnumSet.noneOf(enumType)
dans votrePersistenEnumSet
, déclarerAccessType.PROPERTY
et fournir deux méthodes d'accès qui utilisent la réflexion à lire et à écrire leelements
champ@Embeddable
àPersistentEnumSet
et déposer lesla catégorie "extra" (
... interests = new PersistentEnumSet<>(InterestsEnum.class);
)@AttributeOverride
, comme indiqué dans mon exemple, si vous avez plus d'unPersistentEnumSet
dans votre entité (sinon les deux devraient être stockés à la même colonne "éléments")values()
avec la réflexion dans le constructeur n'est pas optimale (surtout quand on regarde la performance), mais les deux autres options ont leurs inconvénients:EnumSet.getUniverse()
rend l'utilisation d'unsun.misc
classeCollections en JPA se référer à l'un-à-plusieurs ou plusieurs-à-plusieurs relations et ils ne peuvent contenir d'autres entités. Désolé, mais vous auriez besoin d'envelopper ces énumérations dans une entité. Si vous pensez cela, vous auriez besoin d'une sorte de champ de l'ID et la clé étrangère pour stocker cette information de toute façon. C'est moins que vous faire quelque chose de fou comme stocker une liste séparée par des virgules dans une Chaîne de caractères (ne le faites pas!).