2011-09-23 4 views
0

Мне нужно работать со странной структурой БД, где на производстве может быть больше таблиц, но с одинаковыми столбцами. И мы хотим использовать JPA (Hibernate) с их обработкой, по объектам/запросам JPQL. Идея состоит в том, чтобы динамически создавать классы сущностей для каждой таблицы в JVM во время выполнения. Этот подход отлично работает. Я создаю Сущности с Javassist - с использованием уже существующего скомпилированные сущности, и я добавить аннотации к нему динамически (Entity, таблица):Загрузка динамически созданного объекта автоматически dyscovery

public Class generateGroupStateEntity(String className,String tableName) { 
    ClassPool cp = ClassPool.getDefault(); 
    InputStream is = new FileInputStream(new File("MyTemplateEntity.class")); 
    CtClass c = cp.makeClass(is); 
    c.setName(className); 
    ClassFile cf = c.getClassFile(); 
    ConstPool constPool = cf.getConstPool(); 


    AnnotationsAttribute annotAtr = new AnnotationsAttribute(constPool,AnnotationsAttribute.visibleTag); 
    Annotation annot = new Annotation("javax.persistence.Entity", constPool); 
    annotAtr.addAnnotation(annot); 

    Annotation annotTable = new Annotation("javax.persistence.Table", constPool); 
    annotTable.addMemberValue("name", new StringMemberValue(tableName,cf.getConstPool())); 
    annotAtr.addAnnotation(annotTable); 

    cf.addAttribute(annotAtr); 
    return c.toClass(); 
    } 

Когда я построить гибернации SessionFactory вручную, из объекта конфигурации, добавив эти классы используя метод addAnnotatedClass для конфигурации, он отлично работает. Проблема заключается в автоматическом обнаружении, сущность не обнаружена/не найдена ни JPA, ни AnnotationSessionFactoryBean - когда я использую сканирование пакетов в контексте весны. (Я получаю: «QuerySyntaxException: исключение [MyEntity] не отображено»)

Работа класса Class.forName (myNewEntityName) означает, что он инициализируется внутри Classloader.

(Конечно, я знаю, что это не идеальный дизайн туп для Handling этих таблиц.)

Вопрос заключается в том, почему и как это единственный?

(Javassist 3.15.0-GA, спящий режим ядра 3.6.6.Final, зимуют-EntityManager 3.5.6-Final)

+0

Мое первое, хотя это может быть проблема с загрузчиком классов, где он загружен? – csviri

ответ

2

Я думаю, что пакет сканирования происходит на банки и папки в пути к классам - не на classloader level. Это делается для того, чтобы не загружать все классы в память. У этого article есть некоторые подробности, как это делается.

Чтобы решить эту проблему, вам может потребоваться расширить AnnotationSessionFactoryBean - и добавить список классов динамически.

+0

Да, я уже добавил динамическое добавление класса, я проверю реализацию сканирования весной, но, вероятно, это проблема. спасибо – csviri

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