2009-11-25 2 views
2

Я настраиваю кэширование Hibernate и хочу кэшировать определенные объекты в разных регионах. Например, некоторые объекты могут быть «устаревшими» в течение 5 минут, некоторые - в течение часа, а некоторые (например, поисковые запросы) не будут меняться в течение нескольких недель. Для облегчения конфигурации областей в моем коде, я пытаюсь следующее:Аннотации аннотаций в Java 5/6

Я создал аннотацию с именем @LookupCache@DailyCache и т.д.)

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

И я добавляю аннотацию к моей Hibernate/JPA объект:

@LookupCache 
public class Course {} 

Таким образом, я могу легко изменить регион или атрибуты @LookupCache без изменения аннотаций Params каждого класса.

Однако загрузчик кеша не берет эту унаследованную нотацию @Cache. Как получить аннотацию @LookupCache для наследования аннотаций, которые применяются к ней?

Обновление: Чтобы уточнить, аннотация @Cache представляет собой встроенную аннотацию спящего режима, используемую кэшами второго уровня, такими как EHCache. Я не могу изменить аннотацию @Cache, чтобы сделать ее наследуемой другими аннотациями (мой клиент не хочет поддерживать специальную вилку hibernate). Это, вероятно, мой единственный вариант.

+2

Аннотации так не работают, боюсь. Там нет «наследования», как то, что вы ищете, это до Hibernate, чтобы сделать это явно, чего не произойдет, потому что это пользовательская аннотация. – skaffman

+0

Так много для СУХОЙ. Благодарю. –

ответ

2

Вот простой пример, который показывает, как получить информацию о аннотации @Cache, примененной к @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()); 

Вам просто нужно, чтобы убедиться, что @Cache аннотаций также @Retention (RetentionPolicy .RUNTIME)

+0

Это рецепт, который я искал для аннотаций аннотаций! Поскольку getClass(). GetAnnotations() возвращал прокси! –

Смежные вопросы