2011-02-12 64 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