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