2016-08-20 90 views
3

我有一个Spring Boot 1.4应用程序,我试图用Eclipselink而不是休眠。
现在,这是我做的:
从DEPS不能使用弹簧启动eclipselink

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

我尝试以下thisthis教程,但并没有帮助

回答

2

我觉得你的问题是春天的数据版本,您使用的EclipseLink版本之间的不兼容。

SpringBoot中的Eclipselink支持看起来很糟糕。
在弹簧引导依赖pom.xml中:

<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-dependencies</artifactId> 
<version>1.4.0.RELEASE</version> 

properties标签,你可以看到:有关的EclipseLink

<properties> 
... 
<hibernate.version>5.0.9.Final</hibernate.version> 
<hibernate-validator.version>5.2.4.Final</hibernate-validator.version> 
... 
</properties> 

但零信息。
以同样的方式,在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的没有依赖性。很遗憾,因为它可以给一个方式,projets按需使用与当前春季启动版本以这种方式兼容的EclipseLink版本:

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

在你的情况下,它可能是复杂的猜测,因为您的教程使用1.3.2弹簧引导版本其中的EclipseLink的版本与1.4弹簧引导版本兼容。

为了解决您的问题,我建议您尝试使用与您的教程或任何使用SpringBoot和EclipseLink的工作应用程序相同的版本(EclipseLink和Spring Boot)来检查版本兼容性问题。
如果没关系,那么如果你想更新你的Spring Boot或者EclipseLink版本,或者两者兼得,你必须进行测试来验证Spring Boot和EclipseLink版本之间的获胜组合。

+0

我做了它的工作,但发现很多问题和不兼容,我刚回去休眠 –