2011-09-23 27 views
0

我必須使用奇怪的數據庫結構,在生產時可能會有更多的表,但具有相同的列。我們希望使用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決賽)

+0

我的第一個雖然是可能有類加載器的問題,它被加載? – csviri

回答

2

我想包掃描發生在在classpath中罐子和文件夾 - 而不是在類加載器級別。這是爲了優化不將所有類加載到內存中。這article有一些如何完成的細節。

要解決這個問題,您可能需要擴展AnnotationSessionFactoryBean - 並動態添加類的列表。

+0

是的,我已經實現了一個動態類添加,我會檢查在春季掃描的實施,但可能這是問題。謝謝 – csviri