2016-06-07 5 views
2

나는 스프링 프로젝트를 사용 중이다. 저는 여기에 스프링 데이터 JPA 저장소 여기Hibernate 5.2로 마이그레이션하면 다음과 같은 에러가 발생한다 : org.hibernate.HibernateException : 클래스의 타입을 결정할 수 없다 : java.util.Collection

public interface LmsRoleLmsFeatureRepository extends CrudRepository<LmsRoleLmsFeature, Long> { 
    List<LmsRoleLmsFeature> findByLmsRoleIdIn(Collection<Long> ids); 
} 

내 스프링 구성

@Configuration 
@EnableTransactionManagement(mode = AdviceMode.PROXY, proxyTargetClass = false, order = 2) 
@EnableJpaRepositories(
    basePackages = "a.b.c.repositories", 
    entityManagerFactoryRef = "entityManagerFactory", 
    transactionManagerRef = "transactionManager" 
) 
@Import({DatabasePropertiesConfig.class}) 
public class PersistenceConfig { 

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH = "hibernate.max_fetch_depth"; 
    private static final String PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE = "hibernate.jdbc.fetch_size"; 
    private static final String PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE = "hibernate.jdbc.batch_size"; 

    private static final String[] ENTITYMANAGER_PACKAGES_TO_SCAN = {"a.b.c.entities", "a.b.c.converters"}; 

    @Bean(destroyMethod = "close") 
    public DataSource dataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(env.getProperty("driverClassName")); 
     dataSource.setUrl(env.getProperty("url")); 
     dataSource.setUsername(env.getProperty("username")); 
     dataSource.setPassword(env.getProperty("password")); 
     return dataSource; 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return transactionManager; 
    } 

    @Bean 
    public HibernateJpaVendorAdapter vendorAdaptor() { 
     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     return vendorAdapter; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 

     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setJpaVendorAdapter(vendorAdaptor()); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
     entityManagerFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN); 
     entityManagerFactoryBean.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE); 
     entityManagerFactoryBean.setValidationMode(ValidationMode.NONE); 
     entityManagerFactoryBean.setJpaProperties(jpaHibernateProperties()); 

     return entityManagerFactoryBean; 
    } 

    private Properties jpaHibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); 
     properties.put(PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH, env.getProperty(PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH)); 
     properties.put(PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE, env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE)); 
     properties.put(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE, env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE)); 

     return properties;  
    } 

} 

이 코드는 잘 작동이다가 내 POM 조각

..... 
<!-- Spring Data module for JPA repositories. --> 
<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-jpa</artifactId> 
    <version>${spring-data-jpa.version}</version> //1.10.1.RELEASE 
    <scope>compile</scope> 
    <exclusions> 
     <exclusion> 
      <groupId>org.slf4j</groupId> 
      <artifactId>jcl-over-slf4j</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>javax.persistence</artifactId> 
    <version>${javax.persistence.version}</version> //2.1.1 
    <scope>compile</scope> 
</dependency> 

<!-- Hibernate entity manager with JPA 2 support. 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>${hibernate-entitymanager.version}</version> // 5.1.0.Final 
    <scope>runtime</scope> 
    <exclusions> 
     <exclusion> 
      <groupId>org.hibernate.javax.persistence</groupId> 
      <artifactId>hibernate-jpa-2.1-api</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.jboss.spec.javax.transaction</groupId> 
      <artifactId>jboss-transaction-api_1.2_spec</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>xml-apis</groupId> 
      <artifactId>xml-apis</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.jboss.logging</groupId> 
      <artifactId>jboss-logging</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.javassist</groupId> 
      <artifactId>javassist</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<dependency> 
    <groupId>org.javassist</groupId> 
    <artifactId>javassist</artifactId> 
    <version>${javassist.version}</version> // 3.20.0-GA 
    <scope>runtime</scope> 
</dependency> 

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>${hibernate-validator.version}</version> // 5.2.4.Final 
    <scope>runtime</scope> 
    <exclusions> 
     <exclusion> 
      <groupId>org.jboss.logging</groupId> 
      <artifactId>jboss-logging</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator-annotation-processor</artifactId> 
    <version>${hibernate-validator.version}</version> // 5.2.4.Final 
    <scope>compile</scope> 
    <optional>true</optional> 
</dependency> 
..... 

입니다. 내 애플리케이션을 실행할 때 Spring 애플리케이션 컨텍스트가 제대로로드된다. 하지만 내 응용 프로그램이 최대 절전 모드로 변경 될 때 5.2. 내가 Hibernate ORM 5.2 release에서 읽었을 때, hibernate-entitymanager 모듈은 더 이상 존재하지 않습니다. 그 기능은 최대 절전 코어으로 통합되었습니다. 그래서 난 내 hibernate-entitymanager 의존성을 주석 단 hibernate-core 의존성을 포함하십시오이

.... 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>${hibernate-core.version}</version> //5.2.0.Final 
    <scope>runtime</scope> 
    <exclusions> 
     <exclusion> 
      <groupId>org.hibernate.javax.persistence</groupId> 
      <artifactId>hibernate-jpa-2.1-api</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.jboss.spec.javax.transaction</groupId> 
      <artifactId>jboss-transaction-api_1.2_spec</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>xml-apis</groupId> 
      <artifactId>xml-apis</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.jboss.logging</groupId> 
      <artifactId>jboss-logging</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.javassist</groupId> 
      <artifactId>javassist</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<!-- Hibernate entity manager with JPA 2 support. 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>${hibernate-entitymanager.version}</version> 
    <scope>runtime</scope> 
      <exclusions> 
       ... 
      </exclusions> 
     </dependency> 
--> 

..... 

내 POM을 변경했습니다. 내 응용 프로그램을 실행할 때 나는 Collection에서 List로 변경하는 경우하지만 지금은 다음과 같은 오류를

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lmsRoleLmsFeatureRepository': Invocation of init method failed; nested exception is org.hibernate.HibernateException: Could not determine a type for class: java.util.Collection 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
..... 
..... 
Caused by: org.hibernate.HibernateException: Could not determine a type for class: java.util.Collection 
at org.hibernate.internal.SessionFactoryImpl.resolveParameterBindType(SessionFactoryImpl.java:1023) ~[hibernate-core-5.2.0.Final.jar:5.2.0.Final] 
at org.hibernate.query.criteria.internal.CriteriaBuilderImpl.parameter(CriteriaBuilderImpl.java:588) ~[hibernate-core-5.2.0.Final.jar:5.2.0.Final] 
at org.springframework.data.jpa.repository.query.ParameterMetadataProvider.next(ParameterMetadataProvider.java:161) ~[spring-data-jpa-1.10.1.RELEASE.jar:?] 
at org.springframework.data.jpa.repository.query.ParameterMetadataProvider.next(ParameterMetadataProvider.java:138) ~[spring-data-jpa-1.10.1.RELEASE.jar:?] 

를 얻을. 그런 다음 List에 대해 동일한 오류가 발생합니다. 나는 또한 단지 시도했다

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>5.2.0.Final</version> 
</dependency> 

그러나 같은 오류. 왜이 오류가 발생합니까? 내가 뭔가 잘못하고 있는거야? & 감사

바싯 대변인 마흐무드 아메드

+1

스프링 데이터 JPA와 Spring은 (아직까지는) Hibernate 5.2를 아직 지원하지 않습니다. 여러분이 시도 할 수있는 최신 스프링 데이터 JPA 스냅 샷에는 5.2 용 패치가 있습니다. –

+0

HHmm 현재 스프링 사용 5.1.0을 의미합니다. 봄이되면 최대 절전 모드 5.2로 변경됩니다. 그렇다면 Spring에서 Hibernate 5.2로 옮기는 것이 더 낫다. – Basit

+1

https://jira.spring.io/browse/SPR-14327 및 https://jira.spring.io/browse/DATAJPA-911을 참조하십시오. 아마도 여러분은 이러한 것들이 해결 될 때까지 기다릴 필요가있을 것입니다. 아마도 Spring Data JPA뿐만 아니라 Spring을 업그레이드해야 할 것입니다. –

답변

1

바와 같이 here in spring boot forums 언급

덕분에, 5.2.1.Final 최대 절전 모드 버전을 사용하고이 문제를 해결해야한다.

5.2.0으로 봄 부팅시 문제를 재현 할 수 있습니다. 5.2.1로 변경. 최후는 나를 위해 일했습니다.