2009-11-25 4 views
2

Je configure la mise en cache Hibernate et souhaite mettre en cache certaines entités dans différentes régions. Par exemple, certaines entités peuvent être "périmées" jusqu'à 5 minutes, certaines pendant une heure, et certaines (comme les recherches) ne changeront pas pendant des semaines. Pour faciliter config facile des régions dans mon code, je suis en train de ce qui suit:Annotations d'annotations en Java 5/6

J'ai créé une annotation nommée @LookupCache (et @DailyCache etc.)

@Cache(region = "lookups", usage = CacheConcurrencyStrategy.READ_ONLY) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface LookupCache {} 

Et j'ajoute que l'annotation à mon Hibernate/JPA entité:

@LookupCache 
public class Course {} 

de cette façon, je peux facilement changer la région ou les attributs de la @LookupCache sans avoir à changer les params d'annotation de chaque classe.

Toutefois, le chargeur de cache ne récupère pas cette notation @Cache héritée. Comment puis-je obtenir l'annotation @LookupCache pour hériter des annotations qui lui sont appliquées?

Mise à jour: Pour plus de clarté, l'annotation @Cache est une annotation d'hibernation intégrée utilisée par les caches de second niveau comme EHCache. Je ne peux pas modifier l'annotation @Cache pour la rendre héritable par d'autres annotations (mon client ne veut pas maintenir une fourche spéciale d'hibernation). C'est probablement ma seule option cependant.

+2

Les annotations ne fonctionnent pas comme ça, j'ai peur. Il n'y a pas d '«héritage» comme ce que vous cherchez, c'est à Hibernate de le faire explicitement, ce qui n'arrivera pas parce que c'est une annotation personnalisée. – skaffman

+0

Voilà pour DRY. Merci. –

Répondre

2

Voici un exemple simple qui montre comment récupérer les détails de l'annotation @Cache appliquée à votre annotation @LookupCache:

Course c = new Course(); 
LookupCache lookupCache = c.getClass().getAnnotation(LookupCache.class); 
Cache cache = lookupCache.annotationType().getAnnotation(Cache.class); 
System.err.println("region " + cache.region()); 
System.err.println("usage " + cache.usage()); 

Vous devez juste vous assurer que l'annotation @Cache a également @Retention (RetentionPolicy .RUNTIME)

+0

Voici la recette que je cherchais pour lire les annotations des annotations! Depuis le getClass(). GetAnnotations() renvoyait des proxies! –

Questions connexes