【问题标题】:Issue with Spring Data (Spring Boot) and Joda Time field mappingSpring Data (Spring Boot) 和 Joda Time 字段映射问题
【发布时间】:2017-06-12 07:51:37
【问题描述】:

我有一些带有 Joda DateTime 字段的实体。 尝试启动应用程序时,出现以下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map;
[...]
Caused by: java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map;
    at org.jadira.usertype.spi.shared.AbstractUserTypeHibernateIntegrator.integrate(AbstractUserTypeHibernateIntegrator.java:192) ~[usertype.spi-6.0.1.GA.jar:na]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:280) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]

我试着放了

spring.jpa.properties.jadira.usertype.autoRegisterUserTypes=true

在 application.properties 中,但它不起作用。所以我将 Hibernate 注释添加到我的实体类中:

@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    private DateTime from;

它没有用。

我的 pom.xml(部分):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jadira.usertype</groupId>
        <artifactId>usertype.core</artifactId>
        <version>6.0.1.GA</version>
    </dependency>

    <!-- Jackson json data bind -->
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
    </dependency>

我还尝试了 Jadira usertype.core 6.0.0.GA、5.0.0.GA 和 4.0.0.GA,但没有任何变化。我该如何解决?

=====================编辑 调试使我进入AbstractUserTypeHibernateIntegrator类的第192行

 String isEnabled = (String)sessionFactory.getProperties().get("jadira.usertype.autoRegisterUserTypes");

我的调试器说分配给isEnabled 的值是“真”。但是,执行跳转到 finally 子句:ConfigurationHelper.setCurrentSessionFactory((SessionFactory)null)

【问题讨论】:

    标签: spring hibernate spring-boot spring-data-jpa jodatime


    【解决方案1】:

    SessionFactoryImplementor.getProperties() 的签名在 5.2 中更改为返回 Map 而不是 Properties。如果休眠版本低于此,这将导致 NoSuchMethodError。并确保使用与 Hibernate 5.2 兼容的最新 jadira jar

    在你的 pom.xml 中添加这些依赖项

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.0.Final</version>
    </dependency>
    
    <dependency>
        <groupId>org.jadira.usertype</groupId>
        <artifactId>usertype.core</artifactId>
        <version>6.0.1.GA</version>
    </dependency>
    

    【讨论】:

      【解决方案2】:

      上述问题的原因是您忘记添加entitiyManager依赖。

      尝试添加以下依赖项

      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-entitymanager</artifactId>
          <version>4.3.8.Final</version>
      </dependency>
      

      【讨论】:

        【解决方案3】:

        这对我使用 spring boot 有效,问题是 Spring boot 版本 1.5.4 data-jpa starter 具有 hibernate-core 和 hibernate-entitymanager 版本 5.0.12,与 jadira 版本 6.0.1.GA 不兼容所以我们必须在 pom.xml 中覆盖这些并至少提供 5.2.0.Final 版本(我在代码中使用了 5.2.10.Final,因为这是编写时的最新版本)。

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
        
            <dependency>
                <groupId>joda-time</groupId>
                <artifactId>joda-time</artifactId>
            </dependency>
            <dependency>
                <groupId>org.jadira.usertype</groupId>
                <artifactId>usertype.core</artifactId>
                <version>6.0.1.GA</version>
            </dependency>
        
            <!-- Jackson json data bind -->
            <dependency>
                <groupId>com.fasterxml.jackson.jaxrs</groupId>
                <artifactId>jackson-jaxrs-json-provider</artifactId>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.datatype</groupId>
                <artifactId>jackson-datatype-joda</artifactId>
            </dependency>
        
            <!-- Spring boot version 1.5.4  has  hibernate-core 5.0.12 which is incompatible with jadira version 6.0.1.GA -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.2.10.Final</version>
            </dependency>
            <!-- Spring boot version 1.5.4  has  hibernate-entitymanager 5.0.12 which is incompatible with jadira version 6.0.1.GA -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>5.2.10.Final</version>
            </dependency>
        

        【讨论】:

          猜你喜欢
          • 2017-05-18
          • 1970-01-01
          • 2012-04-27
          • 2016-02-17
          • 2020-11-30
          • 2020-06-26
          • 2021-06-28
          • 2018-06-01
          • 1970-01-01
          相关资源
          最近更新 更多