Spring 数据(Spring 引导)和 Joda 时间字段映射问题
Issue with Spring Data (Spring Boot) and Joda Time field mapping
我有一些带有 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 注释添加到我的实体 class:
@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 但没有任何变化。我该如何解决?
====================编辑
调试将我带到 class AbstractUserTypeHibernateIntegrator
的第 192 行
String isEnabled = (String)sessionFactory.getProperties().get("jadira.usertype.autoRegisterUserTypes");
我的调试器说分配给 isEnabled
的值是 "true"。然而,执行跳转到finally子句:ConfigurationHelper.setCurrentSessionFactory((SessionFactory)null)
SessionFactoryImplementor.getProperties() 的签名在 5.2 中更改为 return 映射而不是属性。如果休眠版本低于该版本,则会导致 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>
出现上述问题的原因是您忘记添加entityManager依赖
尝试添加以下依赖项
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
这对我来说对 spring 引导有效,问题是 Spring 引导版本 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>
我有一些带有 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 注释添加到我的实体 class:
@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 但没有任何变化。我该如何解决?
====================编辑
调试将我带到 class AbstractUserTypeHibernateIntegrator
String isEnabled = (String)sessionFactory.getProperties().get("jadira.usertype.autoRegisterUserTypes");
我的调试器说分配给 isEnabled
的值是 "true"。然而,执行跳转到finally子句:ConfigurationHelper.setCurrentSessionFactory((SessionFactory)null)
SessionFactoryImplementor.getProperties() 的签名在 5.2 中更改为 return 映射而不是属性。如果休眠版本低于该版本,则会导致 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>
出现上述问题的原因是您忘记添加entityManager依赖
尝试添加以下依赖项
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
这对我来说对 spring 引导有效,问题是 Spring 引导版本 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>