2013-03-10 3 views
0

J'ai le prochain problème: J'ai une entité "Utilisateur" avec une relation plusieurs à plusieurs à "Rôles". Le truc, c'est que les "Rôles" sont énumérés (il y en a toujours 5) donc les chercher quand je vais chercher un utilisateur ne me semble pas nécessaire (car ils changent rarement). Je voudrais garder en quelque sorte les rôles en mémoire et les attacher à l'utilisateur chaque fois que je l'amène. Il est à noter que Hibernate a un cache de 2nd niveau activé, donc je serai capable d'utiliser ceci si nécessaire. Quelqu'un at-il une solution pour cela?valeurs énumérées avec hibernate et cache

merci à l'avance

+0

La réponse est dans la question, n'est ce pas? Utilisez le cache de second niveau. (Je ne suis pas sûr que cela fera une différence significative, étant donné qu'obtenir un rôle par ID dans une table de 5 lignes sera déjà extrêmement rapide) –

+0

En outre, vous pouvez toujours mettre en cache l'association entre votre rôle et votre utilisateur. – benzonico

Répondre

0

Si vous pouvez modifier votre modèle de données, laissez tomber les rôles de table et de convertir vos nombreux à plusieurs tables en un simple, plusieurs à une table avec une clé étrangère aux utilisateurs, et colonne contenant le rôle (soit varchar ou nombre, mais je conseillerais d'utiliser varchar car il est plus facile à maintenir). Ensuite, vous pouvez mapper ce tableau comme suit:

@Entity 
public class UserRole { 
    @ManyToOne 
    private User user; 
    @Column 
    @Enumerated(EnumType.STRING) // depends if column is varchar or number 
    private Role role; 
} 

public enum Role { ROLE1, ROLE2, ROLE3, ROLE4, ROLE5 } 

Notez que si vous ne laissez pas tomber la table des rôles, il est également possible de le faire aussi longtemps que votre id rôle de sont 0 à 4, en utilisant la cartographie EnumType.ORDINAL (qui est la valeur par défaut). Si elles sont comprises entre 1 et 5, ajoutez un rôle factice au début de l'enum Role.

+0

Mais cela créerait effectivement une relation OneToMany. Donc les entrées ressembleront ("User1", "Role1") ("User1", "Role2") ("User2", "Role1") j'espérais éviter cela – ShinySpiderdude

+0

Eh bien oui bien sûr puisque vous avez cette exigence de attribuer plusieurs rôles à un même utilisateur, vous ne pouvez pas éviter une relation un-à-plusieurs. Vous avez juste besoin de configurer une mise en cache pour éviter de les récupérer à chaque fois, mais avec cette solution, vous n'avez pas besoin d'aller chercher des rôles du tout ce qui semble être ce que vous avez demandé. –