2011-02-12 70 views
4

我想將cglib添加爲默認字節碼提供程序。我正在使用hibernate.cfg.xml文件來配置會話工廠。在休眠應用程序中設置字節碼提供程序的問題

<property name="hibernate.bytecode.provider">cglib</property> 

上面的代碼在我的配置文件中沒有做任何改變的行爲。它仍將javassist設置爲字節碼提供程序。

原來是'javaassist'被設置爲默認提供者。此配置在Environment形式的hibernate.properties文件中更新。除了Environment類的靜態初始化程序之外,我沒有發現任何對字節碼提供程序創建者方法的引用。

是否有任何明確的方式來分配默認字節代碼生成器形式的XML配置文件。

+0

可能重複[?如何強制休眠3.3或3.5,而不是使用了Javassist CGLIB(http://stackoverflow.com/問題/ 2330373/how-to-force-hibernate-3-3-or-3-5-to-use-cglib-instead-of-javassist) – skaffman 2011-02-12 11:25:55

回答

5

Environment javadoc說:

休眠有兩個屬性範圍:

  • 廠級屬性可以傳遞給SessionFactory的時候實例化。每個實例可能具有不同的屬性值。如果沒有指定屬性,工廠將調用Environment.getProperties()。
  • 系統級屬性由所有工廠實例共享,並且始終由環境屬性確定。

唯一的系統級性能是

  • hibernate.jdbc.use_streams_for_binary在
  • hibernate.cglib.use_reflection_optimizer

環境屬性是通過調用System.getProperties(填充)和然後從名爲/hibernate.properties的資源(如果存在)中執行。系統屬性覆蓋hibernate.properties中指定的屬性。

然而,這並不完全正確。查看源代碼後,很明顯hibernate.bytecode.provider也是系統級屬性,因此無法在hibernate.cfg.xml中指定,只能在hibernate.properties中指定。

2

'hibernate.bytecode.provider' 不可不定製:

private static BytecodeProvider buildBytecodeProvider(String providerName) { 
    if ("javassist".equals(providerName)) { 
     return new org.hibernate.bytecode.internal.javassist.BytecodeProviderImpl(); 
    } 

    LOG.unknownBytecodeProvider(providerName); 
    return new org.hibernate.bytecode.internal.javassist.BytecodeProviderImpl(); 
} 
+0

實際上它取決於你使用的是哪個版本的hibernate。 – kenshinji 2015-11-02 02:04:51