【问题标题】:Problem with setting byte code provider in hibernate application在休眠应用程序中设置字节码提供程序的问题
【发布时间】:2022-01-03 21:28:28
【问题描述】:

我正在尝试将 cglib 添加为默认字节码提供程序。我正在使用hibernate.cfg.xml 文件来配置会话工厂。

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

我的配置文件中的上述代码行不会对行为进行任何更改。它仍然将javassist 设置为字节码提供者。

原来是“javaassist”设置为默认提供程序。此配置在 Environment form hibernate.properties 文件中更新。除了 Environment 类的静态初始化程序之外,我没有在任何地方找到对字节码提供程序创建者方法的任何引用。

是否有任何确定的方法可以从 xml 配置文件中分配默认字节码生成器。

【问题讨论】:

标签: hibernate


【解决方案1】:

Environment javadoc 说:

Hibernate 有两个属性范围:

  • 工厂级属性可以在实例化时传递给 SessionFactory。每个实例可能有不同的属性值。如果未指定任何属性,则工厂调用 Environment.getProperties()。
  • 系统级属性由所有工厂实例共享,并且始终由 Environment 属性确定。

唯一的系统级属性是

  • 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();
    }
    

    【讨论】:

    • 其实要看你用的是哪个版本的hibernate。
    猜你喜欢
    • 2014-02-02
    • 2017-11-30
    • 2023-04-04
    • 2010-12-11
    • 2022-11-03
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多