【问题标题】:Maven 3.2.1 + Hibernate 4.3.4 - Unable to build entity manager factory - Caused by: ParameterizedTypeImpl cannot be cast to java.lang.ClassMaven 3.2.1 + Hibernate 4.3.4 - 无法构建实体管理器工厂 - 原因:ParameterizedTypeImpl 无法转换为 java.lang.Class
【发布时间】:2014-04-22 11:52:43
【问题描述】:

我已将 Hibernate 4.3.4 迁移到 Maven 3.2.1 项目。我只用 maven-shade-plugin 创建了一个 jar 文件,但是当我启动它时出现以下异常:

Mar 17, 2014 10:44:35 AM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider               [org.hibernate.ejb.HibernatePersistence]; use     [org.hibernate.jpa.HibernatePersistenceProvider] instead.
Mar 17, 2014 10:44:35 AM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
Mar 17, 2014 10:44:35 AM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider     [org.hibernate.ejb.HibernatePersistence]; use     [org.hibernate.jpa.HibernatePersistenceProvider] instead.
Mar 17, 2014 10:44:35 AM org.hibernate.jpa.internal.util.LogHelper     logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: MfsDao
    ...]
Mar 17, 2014 10:44:36 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.4.Final}
Mar 17, 2014 10:44:36 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000205: Loaded properties from resource hibernate.properties:     {hibernate.connection.driver_class=org.h2.Driver, hibernate.service.allow_crawling=false,     hibernate.dialect=org.hibernate.dialect.H2Dialect, hibernate.max_fetch_depth=5, hibernate.format_sql=true, hibernate.generate_statistics=true, hibernate.connection.username=sa, hibernate.connection.url=jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE, hibernate.bytecode.use_reflection_optimizer=false, hibernate.jdbc.batch_versioned_data=true, hibernate.connection.pool_size=5}
Mar 17, 2014 10:44:36 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Mar 17, 2014 10:44:44 AM     org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}

javax.persistence.PersistenceException: Unable to build entity manager factory
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:81)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at de.cegelec.vwezlt.mfs.dao.MfsEntityManager.getEntityManagerFactory(MfsEntityManager.java:117)
at de.cegelec.vwezlt.mfs.dao.MfsEntityManager.getMfsEntityManager(MfsEntityManager.java:25)
at de.cegelec.vwezlt.mfsvert.main.MfsVert.main(MfsVert.java:168)

Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class
at org.hibernate.cfg.AttributeConverterDefinition.<init>(AttributeConverterDefinition.java:67)
at org.hibernate.cfg.Configuration.addAttributeConverter(Configuration.java:2690)
at org.hibernate.cfg.Configuration.addAttributeConverter(Configuration.java:2641)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.buildHibernateConfiguration(EntityManagerFactoryBuilderImpl.java:1129)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:846)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:397)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:73)

我已经调试过,发现引发异常的类是org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapAttributeConverter

在我的 pom 中,我有一个依赖 log4j 2.0-rc1 作为依赖项:

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.0-rc1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.0-rc1</version>
  </dependency>

在我尝试将所有内容集成到 Maven 之前,它运行良好。

有什么想法吗?

提前致谢!

【问题讨论】:

    标签: java hibernate jpa maven-2 log4j


    【解决方案1】:

    我也偶然发现了这一点。 https://hibernate.atlassian.net/browse/HHH-8804有一张公开票

    我通过降级到 Hibernate 4.2.12.Final 和 JPA2.0 来“解决”它。希望对您有所帮助!

    编辑: 抱歉,没有看到这是一个两个月前的帖子,无论如何希望它对某人有用:P

    【讨论】:

      【解决方案2】:

      我找到了一个可行的解决方法。为了创建一个“胖”jar,我在一个单独的“lib”文件夹(当然包括 Hibernate)中创建了一个包含我的项目和所有依赖项的 Jar。

      我不知道怎么做,但现在可以了。

      【讨论】:

        【解决方案3】:

        正如 aaronfc 已经提到的,hibernate JIRA 上有一张公开票:https://hibernate.atlassian.net/browse/HHH-8804

        所以问题是与 Log4j2 转换器的冲突,更详细地说,是 db appender JPA 转换器。

        但是,只有“胖”罐子才会出现问题......

        解决方法:如果您使用 maven-shade-plugin 来打包您的 jar - 并且不需要任何 log4j2 db appender,您可以排除冲突的 Converter 类:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <shadedArtifactAttached>true</shadedArtifactAttached>
                        <shadedClassifierName>jar-with-dependencies</shadedClassifierName> 
                        <filters>
                            <filter>
                                <artifact>org.apache.logging.log4j:*</artifact>
                                <excludes>
                                    <exclude>org/apache/logging/log4j/core/appender/db/jpa/converter/*</exclude>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        

        【讨论】:

        • 这对我有用,如 - 直接从 jar 中删除转换器包。 @hartmut,你知道如何在 Gradle 中实现自动化吗?
        • 好的,回答了我自己的问题,请参阅下面的扩展答案
        • 为我工作。谢谢!
        【解决方案4】:

        作为@hartmut 答案的扩展,如果您使用的是 Gradle,请包含 Gradle Shadow,并在 build.gradle 中执行以下操作:

        shadowJar {
            exclude 'org/apache/logging/log4j/core/appender/db/jpa/converter/*'
        }
        

        然后你可以运行 gradle shadowJar 来创建 jar

        【讨论】:

          猜你喜欢
          • 2020-01-16
          • 2014-05-20
          • 1970-01-01
          • 2016-03-17
          • 1970-01-01
          • 2015-06-18
          • 2015-04-19
          • 2013-05-01
          • 1970-01-01
          相关资源
          最近更新 更多