2016-06-07 10 views
2

Ich verwende Spring-Projekt. Hier ist mein POM SchnipselMigrieren zu Hibernate 5.2 gibt Fehler verursacht durch: org.hibernate.HibernateException: Konnte einen Typ für Klasse nicht ermitteln: java.util.Collection

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

ich eine Feder Daten JPA-Repository haben

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

Hier ist meine Federkonfiguration

@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;  
    } 

} 

Dieser Code funktioniert gut. Wenn ich meine Anwendung ausführe, wird der Spring-Anwendungskontext ordnungsgemäß geladen. Aber wenn ich meine Anwendung in Hibernate 5.2 ändere. Wie ich aus Hibernate ORM 5.2 release gelesen habe, dass Hibernate-Entitymanager-Modul nicht mehr existiert. Seine Funktionalität wurde in Hibernate-Core konsolidiert. Also änderte ich meine POM dieser

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

..... 

Meine hibernate-entitymanager Abhängigkeit Kommentar und umfassen nur hibernate-core Abhängigkeit. Aber jetzt, wenn ich meine Anwendung ausführen bekomme ich folgende Fehler

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:?] 

Wenn ich von Collection zu List ändern. Dann bekomme ich den gleichen Fehler für List. Ich habe auch versucht mit nur

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

Aber der gleiche Fehler. Warum bekomme ich diesen Fehler? Mache ich etwas falsch ?

Dank & Grüße

Basit Mahmood Ahmed

+1

Spring Data JPA und Spring unterstützen Hibernate 5.2 noch nicht (vollständig). Im aktuellen Spring Data JPA-Snapshot gibt es Patches für 5.2, die Sie ausprobieren könnten. –

+0

HHmm es bedeutet zur Zeit mit Feder Verwendung 5.1.0. Einmal Frühling mit Hibernate 5.2 Änderungen ankündigen. Dann ist es besser, auf Hibernate 5.2 mit Spring zu gehen? – Basit

+1

Siehe https://jira.spring.io/browse/SPR-14327 und https://jira.spring.io/browse/DATAJPA-911. Ich denke, dass Sie warten müssen, bis diese gelöst sind und es wahrscheinlich ein Upgrade von Spring sowie Spring Data JPA beinhaltet. –

Antwort

1

Wie here in spring boot forums erwähnt, verwenden Sie die 5.2.1.Final Hibernate Version und es sollte dieses Problem beheben.

Ich könnte Ihr Problem in Spring Boot mit 5.2.0 replizieren. Der Wechsel zu 5.2.1.Final hat bei mir funktioniert.

Verwandte Themen