无法将 eclipselink 与 spring 引导一起使用
cannot use eclipselink with spring boot
我有一个 Spring Boot 1.4 应用程序,我正在尝试使用 Eclipselink 代替 Hibernate。
现在,这就是我所做的:
从 deps
中删除了 Hibernate
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</exclusion>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</exclusion>
</exclusions>
</dependency>
添加了 eclipse 链接
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.3</version>
</dependency>
已配置JpaBaseConfiguration
@Configuration
public class JpaConfiguration extends JpaBaseConfiguration {
protected JpaConfiguration(DataSource dataSource, JpaProperties properties, ObjectProvider<JtaTransactionManager> jtaTransactionManagerProvider) {
super(dataSource, properties, jtaTransactionManagerProvider);
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(final EntityManagerFactoryBuilder builder, @Autowired DataSource dataSource) {
final LocalContainerEntityManagerFactoryBean ret = builder.dataSource(dataSource)
.packages("com.inkdrop.app.domain.models")
.persistenceUnit("chathub-perstence-unit")
.properties(getVendorProperties())
.build();
return ret;
}
@Override
protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
return new EclipseLinkJpaVendorAdapter();
}
@Override
protected Map<String, Object> getVendorProperties() {
return Collections.singletonMap("eclipselink.weaving", "false");
}
当我 运行 应用程序时,它在数据库中创建表(代表我的模型),然后抛出此错误:
Caused by: java.lang.ClassCastException: org.eclipse.persistence.internal.jpa.metamodel.SingularAttributeImpl cannot be cast to javax.persistence.metamodel.PluralAttribute
at org.eclipse.persistence.internal.jpa.querydef.FromImpl.join(FromImpl.java:485)
at org.springframework.data.jpa.repository.query.QueryUtils.getOrCreateJoin(QueryUtils.java:596)
at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:524)
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.getTypedPath(JpaQueryCreator.java:332)
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:275)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:180)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:109)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:49)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:109)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:88)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:73)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.<init>(PartTreeJpaQuery.java:118)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.<init>(PartTreeJpaQuery.java:241)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:68)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:103)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:214)
我认为您的问题是 Spring 数据版本与您使用的 EclipseLink 版本不兼容。
SpringBoot 中的 Eclipselink 支持似乎很糟糕。
在 spring-boot-dependencies 的 pom.xml 中:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.0.RELEASE</version>
在properties
标签中,可以看到:
<properties>
...
<hibernate.version>5.0.9.Final</hibernate.version>
<hibernate-validator.version>5.2.4.Final</hibernate-validator.version>
...
</properties>
但关于 Eclipselink 的信息为零。
同样,在 spring-boot-starter-data-jpa
pom 中,您在 dependencies
标签中对 hibernate-core
有直接依赖:
<dependencies>
...
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
</exclusion>
</exclusions>
</dependency>
...
<dependencies>
但在 dependenciesManagement
标记中没有对 EclipseLink 的依赖。很遗憾,因为它可以提供一种方法,让项目按需使用与当前 Spring 引导版本兼容的 EclipseLink 版本:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
</dependency>
但由于缺少此功能,您必须在 pom.xml 中指定 Eclipslink 的版本:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.3</version>
</dependency>
在您的情况下,猜测哪个版本的 Eclipselink 与 1.4 spring 引导版本兼容可能很复杂,因为您的教程使用 1.3.2 spring 引导版本。
为了解决您的问题,我建议您尝试使用与教程中相同的版本(EclipseLink 和 Spring Boot)或任何使用 SpringBoot 和 EclipseLink 的工作应用程序来检查它是否正确嗯,版本兼容性问题。
如果没问题,那么如果您想更新 Spring Boot 或 EclipseLink 版本或两者,您必须进行测试以验证 Spring Boot 和 EclipseLink 版本之间的成功组合。
我有一个 Spring Boot 1.4 应用程序,我正在尝试使用 Eclipselink 代替 Hibernate。
现在,这就是我所做的:
从 deps
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</exclusion>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</exclusion>
</exclusions>
</dependency>
添加了 eclipse 链接
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.3</version>
</dependency>
已配置JpaBaseConfiguration
@Configuration
public class JpaConfiguration extends JpaBaseConfiguration {
protected JpaConfiguration(DataSource dataSource, JpaProperties properties, ObjectProvider<JtaTransactionManager> jtaTransactionManagerProvider) {
super(dataSource, properties, jtaTransactionManagerProvider);
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(final EntityManagerFactoryBuilder builder, @Autowired DataSource dataSource) {
final LocalContainerEntityManagerFactoryBean ret = builder.dataSource(dataSource)
.packages("com.inkdrop.app.domain.models")
.persistenceUnit("chathub-perstence-unit")
.properties(getVendorProperties())
.build();
return ret;
}
@Override
protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
return new EclipseLinkJpaVendorAdapter();
}
@Override
protected Map<String, Object> getVendorProperties() {
return Collections.singletonMap("eclipselink.weaving", "false");
}
当我 运行 应用程序时,它在数据库中创建表(代表我的模型),然后抛出此错误:
Caused by: java.lang.ClassCastException: org.eclipse.persistence.internal.jpa.metamodel.SingularAttributeImpl cannot be cast to javax.persistence.metamodel.PluralAttribute
at org.eclipse.persistence.internal.jpa.querydef.FromImpl.join(FromImpl.java:485)
at org.springframework.data.jpa.repository.query.QueryUtils.getOrCreateJoin(QueryUtils.java:596)
at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:524)
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.getTypedPath(JpaQueryCreator.java:332)
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:275)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:180)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:109)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:49)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:109)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:88)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:73)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.<init>(PartTreeJpaQuery.java:118)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.<init>(PartTreeJpaQuery.java:241)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:68)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:103)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:214)
我认为您的问题是 Spring 数据版本与您使用的 EclipseLink 版本不兼容。
SpringBoot 中的 Eclipselink 支持似乎很糟糕。
在 spring-boot-dependencies 的 pom.xml 中:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.0.RELEASE</version>
在properties
标签中,可以看到:
<properties>
...
<hibernate.version>5.0.9.Final</hibernate.version>
<hibernate-validator.version>5.2.4.Final</hibernate-validator.version>
...
</properties>
但关于 Eclipselink 的信息为零。
同样,在 spring-boot-starter-data-jpa
pom 中,您在 dependencies
标签中对 hibernate-core
有直接依赖:
<dependencies>
...
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
</exclusion>
</exclusions>
</dependency>
...
<dependencies>
但在 dependenciesManagement
标记中没有对 EclipseLink 的依赖。很遗憾,因为它可以提供一种方法,让项目按需使用与当前 Spring 引导版本兼容的 EclipseLink 版本:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
</dependency>
但由于缺少此功能,您必须在 pom.xml 中指定 Eclipslink 的版本:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.3</version>
</dependency>
在您的情况下,猜测哪个版本的 Eclipselink 与 1.4 spring 引导版本兼容可能很复杂,因为您的教程使用 1.3.2 spring 引导版本。
为了解决您的问题,我建议您尝试使用与教程中相同的版本(EclipseLink 和 Spring Boot)或任何使用 SpringBoot 和 EclipseLink 的工作应用程序来检查它是否正确嗯,版本兼容性问题。
如果没问题,那么如果您想更新 Spring Boot 或 EclipseLink 版本或两者,您必须进行测试以验证 Spring Boot 和 EclipseLink 版本之间的成功组合。