我必須使用奇怪的數據庫結構,在生產時可能會有更多的表,但具有相同的列。我們希望使用JPA(Hibernate)來處理它們,通過實體/ JPQL查詢。這個想法是在運行時在JVM中動態地爲每個表創建實體類。這種方法工作正常。我創建實體用Javassist - 使用已經存在的編譯的實體,我添加註釋它動態地(實體,表):通過自動恢復加載動態創建的實體
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();
}
當我建立一個Hibernate SessionFactory的手,從配置對象,添加該班使用addAnnotatedClass方法來配置,它工作正常。問題在於自動發現,實體不會被JPA或AnnotationSessionFactoryBean發現/發現 - 當我在spring上下文中使用包掃描時。 (我得到:「QuerySyntaxException:[MyEntity]未映射」異常)
Class.forName(myNewEntityName)作品表示它在Classloader中初始化。
(當然,我知道這是不是爲處理這些表是一種理想的設計模式。)
的問題是,爲什麼和如何唯一呢?
(Javassist是3.15.0-GA,休眠核心3.6.6.Final,休眠-的EntityManager 3.5.6決賽)
我的第一個雖然是可能有類加載器的問題,它被加載? – csviri