我根据“Spring in Action”第 11 章创建了一个 spring JPA 示例。
Java配置代码:
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
System.out.println("hello");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
System.out.println(adapter);
adapter.setDatabase(Database.MYSQL);
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");
return adapter;
}
@Bean
public EntityManagerFactory entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
emfb.setDataSource(dataSource);
//emfb.setPersistenceUnitName("test");
emfb.setJpaVendorAdapter(jpaVendorAdapter);
emfb.setPackagesToScan("com.springinaction.test");
EntityManagerFactory emf = emfb.getObject();
System.out.println(emf);
return emf;
}
@Bean
public PlatformTransactionManager annotationDrivenTransactionManager(EntityManagerFactory emf) {
//System.out.println(emf);
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
与 Spring JPA 关联的 Maven 依赖项:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
程序运行良好直到这行代码:
System.out.println("hello");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
失败并显示以下错误消息:
hello
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class com.springinaction.test.JdbcConfig: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.orm.jpa.JpaVendorAdapter com.springinaction.test.JdbcConfig.jpaVendorAdapter()] threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence
有人对我说原因可能是缺少 hibernate-entitymanger.jar,但我在本地 Maven 存储库中找到了这个 jar。
有人说原因是缺少 ejb3-persistence.jar,但我找不到为此的 Maven groupId/artifactId。
有人可以向我解释一下吗?
最佳答案
org.hibernate.ejb.HibernatePersistence 类是 hibernate-entitymanager jar 的一部分。请检查此 jar 是否在您的项目类路径或已部署的 war 文件中。还要检查此 jar 文件的版本。您应该在 pom.xml 中提供 hibernate-entitymanager 依赖项,而不是提供 hibernate-core 和 hibernate-jpa 依赖项,这将下载所有必需的依赖项。您可以在https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager/5.2.2.Final查看相同内容
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.2.Final</version>
</dependency>
Spring In Action 的源代码位于 https://manning-content.s3.amazonaws.com/download/9/ef4e0ef-b7bd-4ab8-857d-eb635d18d425/SpringiA4_SourceCode.zip 。您可以检查 build.gradle 文件是否使用了依赖项。
关于java - 创建 HibernateJpaVendorAdapter 实例失败。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39312982/