4

尝试在 JBoss-4.2.3.GA 中使用以下设置部署应用程序 ear 文件

jboss-app.xml

<jboss-app>
    <loader-repository>
        com.xxxx.xxx:loader=<ear-name>
      <loader-repository-config>
        java2ParentDelegation=false
      </loader-repository-config>  
    </loader-repository>
</jboss-app>

persistence.xml(只是一个片段)

<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.hbm2ddl.auto" value="validate"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.format_sql" value="false"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:/XXXXFactory"/>

在部署期间获得了以下记录器信息,我不确定为什么 INFO 记录器中列出了异常,我可以不为此烦恼吗?

16:30:07,239 INFO  [STDOUT] 16:30:07,238 INFO  [SettingsFactory] JDBC driver: Oracle JDBC driver, version: 11.2.0.3.0
javax.ejb.EJBException: org.hibernate.HibernateException: unknown Oracle major version [11]
    at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:63)
    at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)


Caused by: org.hibernate.HibernateException: unknown Oracle major version [11]
    at org.hibernate.dialect.DialectFactory$1.getDialectClass(DialectFactory.java:135)
    at org.hibernate.dialect.DialectFactory.determineDialect(DialectFactory.java:65)
    at org.hibernate.dialect.DialectFactory.buildDialect(DialectFactory.java:39)
    at org.hibernate.cfg.SettingsFactory.determineDialect(SettingsFactory.java:426)

注意:我们使用的是 JBoss-Seam-2.2.0.GA

试过:这个这个那个

如果需要任何其他信息,请告诉我,我正在尝试将 jboss 中可用的库拉回耳朵。

更新:尝试

  1. 发现应用程序正在使用 2 个不同的会话,并且
    有一个 hibernate.cfg.xml 也用于另一个遗留代码,其中没有指定方言。
  2. 所以将Oracle10g方言添加到cfg.xml,它停止抛出上述未知oracle版本错误,但由于无法加载10gDialect而异常。
  3. 美是两个会话都指向同一个数据源。
4

3 回答 3

9

尝试添加

hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

也到JBoss/server/default/deploy/ejb3.deployer/META-INF/persistence.properties

它适用于 JBoss-4.2.3.GA 捆绑的 Hibernate 3.2.4.sp1 和 ojdbc5 11.1.0.6.0(都在 JBoss 全局库中)。

更新

还要重新检查类路径中的某个位置是否不存在旧版本的休眠。

JBoss-Seam-2.2.0.GA 分发包捆绑休眠 3.3.1.GA 而针对 Oracle 数据库 11g 的休眠方言?建议至少Hibernate 3.3.2+ is required for recent JDBC drivers

JBoss-4.2.3.GA 捆绑的 Hibernate 3.2.4.sp1 可能有一些现代人员向后移植。

于 2012-09-19T05:45:31.610 回答
0

我从来没有遇到过这种例外,但对我来说这听起来很清楚:

Hibernate 的 DialectFactory 应该维护某种数据库引擎类型的映射

(包括版本)到实际的方言。整个问题是您没有到 Oracle 11 的重新映射

作为第一个赌注,我会看看这个特定的课程。我不知道你有什么版本的hibernate,但看起来Oracle 11根本不支持,至少我找到的来源(看看这里)看看那个''MAPPERS''哈希地图,你会看到......这里的开源规则;)

所以我认为最好的办法是将休眠升级到最新版本(只需检查最新版本中映射器是否已更新)。或者至少调试应用程序服务器以找出将参数传递给方法的内容等等。

当然,它也可以构建您的自定义版本的 Hibernate,但我认为它不应该被视为更可取的解决方案。

我也会考虑覆盖默认方言,因为你已经在“那个”文章中找到了:) 我不明白为什么它不应该工作,但你最好再次调试它。也许你应该在某个地方告诉 JBoss 它也应该使用你的方言......

希望这可以帮助

于 2012-09-19T05:58:01.053 回答
0
  public String getDialectClass(int majorVersion) throws Throwable
        {
            switch(majorVersion)
            {
            case 8: // '\b'
                return (DialectFactory.class$org$hibernate$dialect$Oracle8iDialect != null ? DialectFactory.class$org$hibernate$dialect$Oracle8iDialect : (DialectFactory.class$org$hibernate$dialect$Oracle8iDialect = DialectFactory._mthclass$("org.hibernate.dialect.Oracle8iDialect"))).getName();

            case 9: // '\t'
                return (DialectFactory.class$org$hibernate$dialect$Oracle9iDialect != null ? DialectFactory.class$org$hibernate$dialect$Oracle9iDialect : (DialectFactory.class$org$hibernate$dialect$Oracle9iDialect = DialectFactory._mthclass$("org.hibernate.dialect.Oracle9iDialect"))).getName();

            case 10: // '\n'
                return (DialectFactory.class$org$hibernate$dialect$Oracle10gDialect != null ? DialectFactory.class$org$hibernate$dialect$Oracle10gDialect : (DialectFactory.class$org$hibernate$dialect$Oracle10gDialect = DialectFactory._mthclass$("org.hibernate.dialect.Oracle10gDialect"))).getName();

            case 11: // '\013'
                return (DialectFactory.class$org$hibernate$dialect$Oracle10gDialect != null ? DialectFactory.class$org$hibernate$dialect$Oracle10gDialect : (DialectFactory.class$org$hibernate$dialect$Oracle10gDialect = DialectFactory._mthclass$("org.hibernate.dialect.Oracle10gDialect"))).getName();



        }



            throw new HibernateException("unknown Oracle major version [" + majorVersion + "]");
        }

实际上这是 DialectFactory 中的代码,因此当您的数据库版本更改为 11 以上时,您将遇到此问题我添加了额外的开关盒,它解决了我的问题

于 2016-05-30T08:49:40.430 回答