Использование hibernate-envers с пользовательской аннотацией

#java #hibernate #classloader #hibernate-envers #interception

#java #гибернация #загрузчик классов #hibernate-envers #перехват

Вопрос:

В моем текущем проекте нам необходимо распространять JAR с классами сущностей для использования с клиентом REST тонким способом (как можно тоньше). Аннотации @Entity (из JPA) не являются проблемой, но когда одни и те же классы аннотируются с помощью hibernate-envers @Audited , зависимости становятся проблемой.

Вместо работы с интерфейсами для классов сущностей моя текущая идея решения этой проблемы включает в себя создание @customauditannotattation и, во время начальной загрузки в режиме гибернации, распознавать их как аннотации hibernate-envers.

Что-то вроде этого:

 @Entity
@CustomAuditedAnnotation
public class MyEnity implements Serializable {
...
}
  

И во время гибернации boosstrapping:

 ...
public void onEntityClassLoad(Class<? extends Serializable> clazz) {
    final CustomAuditAnnotation auditAnn = clazz.getAnnotation(CustomAuditAnnotation.class);

    if (auditAnn != null) {
        Field annField = clazz.getDeclaredField("annotations");
        annField.setAccessible(true);
        @SuppressWarnings("unchecked")
        Map<Class<? extends Annotation>, Annotation> annotations = (Map<Class<? extends Annotation>, Annotation>) annField
                .get(clazz);
        annotations.put(Audited.class, new Audited() {

            @Override
            public Class<? extends Annotation> annotationType() {
                return Audited.class;
            }

            @Override
            public RelationTargetAuditMode targetAuditMode() {
                return RelationTargetAuditMode.valueOf(auditAnn.targetAuditMode());
            }

            @Override
            public ModificationStore modStore() {
                return null;
            }

            @Override
            public Class[] auditParents() {
                return null;
            }
        });
    }
}
  

Мой контекст: JBossAS 7.1.1.Final, Hibernate 4.0.1, метод, описанный выше, должен оставаться внутри JAR, который не распространяется (на стороне сервера).

Вопрос:

Как перехватить момент, когда hibernate загружает сопоставленные классы сущностей?

Комментарии:

1. Как вы собираетесь управлять сценариями, в которых определенные атрибуты в классе не должны проверяться, в то время как другие проверяются? Как вы собираетесь обрабатывать другие аннотации Envers, такие как AuditMappedBy , AuditJoinTable , и т.д. Я понимаю озабоченность по поводу аннотаций Envers, требующих полного стека гибернации, но то же самое было бы верно, если бы вы также использовали какие-либо пользовательские аннотации Hibernate, верно?

2. Действительно, это может быть проблемой, но в настоящее время такие аннотации не нужны. Я думаю, что до реализации XML-конфигурации hibernate-envers есть единственный способ … создать «тонкие аннотации» в качестве заменителей.