Аннотации аннотаций в Java 5/6

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

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

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

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

@LookupCache
public class Course {}

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

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

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


person Community    schedule 25.11.2009    source источник
comment
Боюсь, аннотации так не работают. Нет такого наследования, как то, что вы ищете, Hibernate должен сделать это явно, чего не произойдет, потому что это пользовательская аннотация.   -  person skaffman    schedule 25.11.2009
comment
Так много для DRY. Спасибо.   -  person Ashish Tonse    schedule 25.11.2009


Ответы (1)


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

person Eugene Kuleshov    schedule 03.12.2009
comment
Это рецепт, который я искал, читая аннотации аннотаций! Так как getClass().getAnnotations() возвращал прокси! - person Remi Morin; 05.09.2013