нельзя использовать eclipselink с пружинной загрузкой

jpa spring-boot spring-data eclipselink spring-data-jpa

3133 просмотра

1 ответ

У меня есть приложение Spring Boot 1.4, в котором я пытаюсь использовать Eclipselink вместо Hibernate.
На данный момент, это то, что я сделал:
убрал 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>

Добавлен eclipselink

<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)

Я пытался следовать этим и этим учебникам, но не помог

Автор: Luiz E. Источник Размещён: 08.11.2019 11:26

Ответы (1)


3 плюса

Решение

Я думаю, что ваша проблема заключается в несовместимости между версией Spring Data и версией EclipseLink, которую вы используете.

Поддержка Eclipselink в SpringBoot кажется плохой.
В pom.xml Spring-boot-зависимости:

<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-jpapom у вас есть прямая зависимость для hibernate-corein dependenciestag:

<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>

но нет никакой зависимости для EclipseLink в dependenciesManagementтеге. Жаль, так как он мог бы дать способ проектам использовать по требованию версию EclipseLink, совместимую с текущей версией Spring Boot:

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
</dependency>

Но так как эта функция отсутствует, вы должны указать версию Eclipslink в вашем pom.xml:

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.6.3</version>
</dependency>

В вашем случае может быть сложно угадать, какая версия Eclipselink совместима с версией весенней загрузки 1.4, так как ваше руководство использует версию весенней загрузки 1.3.2.

Чтобы решить вашу проблему, я советую вам попробовать те же версии (EclipseLink и Spring Boot), что и в вашем руководстве, или любое другое работающее приложение, использующее SpringBoot и EclipseLink, чтобы убедиться, что это проблема совместимости версий.
Если все в порядке, то и если вы хотите обновить версию Spring Boot или EclipseLink или обе, вы должны выполнить тесты для проверки выигрышной комбинации между версиями Spring Boot и EclipseLink.

Автор: davidxxx Размещён: 20.08.2016 03:24
Вопросы из категории :
32x32