【问题标题】:Hibernate version to support Oracle12cDialect and JPA 2.0Hibernate 版本支持 Oracle12cDialect 和 JPA 2.0
【发布时间】:2019-02-28 17:41:38
【问题描述】:

我将我的应用程序(Spring + Hibernate + JPA)部署到 Websphere 应用程序服务器,并且应用程序连接到数据库版本 Oracle 12c。

为了支持 Oracle 12c DB,我需要 Oracle12c Dialect 和 Websphere Application server(8.5.5) 支持 JPA 2.0。

我看到 Hibernate 版本 > 5 只提供 Oracle12cDialect,不提供 JPA 2.0,而是提供 (hibernate-jpa-2.1-api-1.0.0.Final.jar)

V3.5 到 V4.2 支持 JPA 2.0(但这些版本不适用于 Oracle12cDialect)

当我使用hibernate-entitymanager.5.0.7.Final.jar 时,我在服务调用期间收到以下错误。

错误:

Caused by: java.lang.ClassCastException: com.ibm.websphere.persistence.PersistenceProviderImpl incompatible with javax.persistence.spi.PersistenceProvider
                at javax.persistence.Persistence$1.isLoaded(Persistence.java:110) ~[hibernate-jpa-2.1-api-1.0.0.Final.jar:1.0.0.Final]
                at org.hibernate.validator.internal.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:57) ~[hibernate-validator-4.3.0.Final.jar:4.3.0.Final]
                at org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:130) ~[hibernate-validator-4.3.0.Final.jar:4.3.0.Final]
                at org.hibernate.validator.internal.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:46) ~[hibernate-validator-4.3.0.Final.jar:4.3.0.Final]
                at org.hibernate.validator.internal.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1221) ~[hibernate-validator-4.3.0.Final.jar:4.3.0.Final

如果我尝试保持应用程序提供的 hibernate-jpa-2.1-api-1.0.0.Final.jar 范围,则会产生以下问题,因为 AttributeConverter 类在 Websphere JPA 2.0 中不可用

ERROR o.s.web.servlet.DispatcherServlet - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax.persistence.AttributeConverter
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) ~[spring-beans-3.1.3.RELEASE.jar:3.1.3.RELEASE]
Caused by: java.lang.NoClassDefFoundError: javax.persistence.AttributeConverter
                at org.hibernate.boot.internal.MetadataBuilderImpl.<init>(MetadataBuilderImpl.java:127) ~[hibernate-core-5.0.7.Final.jar:5.0.7.Final]
                at org.hibernate.boot.MetadataSources.getMetadataBuilder(MetadataSources.java:135) ~[hibernate-core-5.0.7.Final.jar:5.0.7.Final]
                at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:185) ~[hibernate-entitymanager-5.0.7.Final.jar:5.0.7.Final]
                at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:34) ~[hibernate-entitymanager-5.0.7.Final.jar:5.0.7.Final]
                at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:165) ~[hibernate-entitymanager-5.0.7.Final.jar:5.0.7.Final]
                at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:160) ~[hibernate-entitymanager-5.0.7.Final.jar:5.0.7.Final]
                at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:135) ~[hibernate-entitymanager-5.0.7.Final.jar:5.0.7.Final]
                at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:50) ~[hibernate-entitymanager-5.0.7.Final.jar:5.0.7.Final]
                at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:287) ~[spring-orm-3.1.3.RELEASE.jar:3.1.3.RELEASE]
                at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) ~[spring-orm-3.1.3.RELEASE.jar:3.1.3.RELEASE]
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) ~[spring-beans-3.1.3.RELEASE.jar:3.1.3.RELEASE]
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) ~[spring-beans-3.1.3.RELEASE.jar:3.1.3.RELEASE]
                ... 69 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.persistence.AttributeConverter
                at java.net.URLClassLoader.findClass(URLClassLoader.java:600) ~[na:1.7.0]
                at com.ibm.ws.bootstrap.ExtClassLoader.findClass(ExtClassLoader.java:240) ~[bootstrap.jar:WAS855.SERV1 [cf051507.01]]
                at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:941) ~[na:1.7.0]
                at java.lang.ClassLoader.loadClass(ClassLoader.java:876) ~[na:1.7.0]
                at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:133) ~[bootstrap.jar:WAS855.SERV1 [cf051507.01]]
                at java.lang.ClassLoader.loadClass(ClassLoader.java:846) ~[na:1.7.0]
                at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:62) ~[com.ibm.ws.runtime.jar:WAS855.SERV1 [cf051507.01]]
                at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:58) ~[com.ibm.ws.runtime.jar:WAS855.SERV1 [cf051507.01]]
                at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:617) ~[com.ibm.ws.runtime.jar:WAS855.SERV1 [cf051507.01]]
                at java.lang.ClassLoader.loadClass(ClassLoader.java:846) ~[na:1.7.0]
                at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:617) ~[com.ibm.ws.runtime.jar:WAS855.SERV1 [cf051507.01]]
                at java.lang.ClassLoader.loadClass(ClassLoader.java:846) ~[na:1.7.0]
                ... 81 common frames omitted

如果我使用Hibernate版本支持JPA 2.0,那么只需要使用Oracle10gDialect。

hibernate 和 webSphere 成员有什么想法吗?

【问题讨论】:

  • 为什么与您使用 Oracle12cDialect 相关?

标签: java hibernate jpa websphere websphere-8


【解决方案1】:

这个问题没有解决办法,你只能:

  • 将您的Websphere 版本升级到WAS 9.0(当然,这很容易:))
  • 继续使用Oracle10gDialect,除了特定于版本的细节(但我从未在简单的JPA 使用中遇到任何问题),与Oracle 12 配合得很好。

附:有一个 IBM note 关于在 WAS 8.5.5 上启用 JPA 2.1 但老实说,努力没有得到回报(不再有容器管理的持久性?不用了,谢谢)。

【讨论】:

  • 就我而言,将 Websphere 升级到 V9 并不容易。我认为Oracle10gDialect只要没有Oracle 12c数据库的特定特性是可以使用的。我想知道为什么没有支持Oracle12cDialect和JPA 2.0的hibernate版本。
  • 因为 JPA 2.1 是自 2013 年以来的最终版本......您会看到 JPA 2.2 和更高版本的 Oracle 版本具有相同的行为。附言我对将 WAS 升级为一件容易的事感到讽刺。
猜你喜欢
  • 1970-01-01
  • 2018-04-07
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多