#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 есть единственный способ … создать «тонкие аннотации» в качестве заменителей.