我正在部署一个使用JPA的Web服务,包括Persistence.xml。由于persistence.xml文件位于src文件夹中,因此使用build.xml创建的war文件不会在最终创建war文件之前在jar中创建persistence.xml。
Web服务客户端抱怨"没有为EntityManager提供的名为xxx&#34的持久性提供程序;
是否可以选择将persistence.xml替换为另一个代码(可能不使用Spring)
答案 0 :(得分:0)
您可以在Spring中配置Hibernate而不使用persistence.xml,如下所示:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
Map<String, Object> properties = new Hashtable<>();
properties.put("javax.persistence.schema-generation.database.action",
"none");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect"); //you can change this if you have a different DB
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(adapter);
factory.setDataSource(this.springJpaDataSource());
factory.setPackagesToScan("package name");
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
factory.setValidationMode(ValidationMode.NONE);
factory.setJpaPropertyMap(properties);
return factory;
}
由于您没有使用persistence.xml,您应该创建一个返回DataSource的bean,您可以在上面设置数据源的方法中指定它:
@Bean
public DataSource springJpaDataSource()
{
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl("jdbc:mysql://localhost/SpringJpa");
dataSource.setUsername("tomcatUser");
dataSource.setPassword("password1234");
return dataSource;
}
然后在此配置文件上使用@EnableTransactionManagement
注释。现在当你放置那个注释时,你必须创建一个最后一个bean:
@Bean
public PlatformTransactionManager jpaTransactionManager()
{
return new JpaTransactionManager(
this.entityManagerFactoryBean().getObject());
}
现在,不要忘记对那些处理DB的方法使用@Transactional
注释。
最后,不要忘记在您的存储库中注入EntityManager
(此存储库类应该对其进行@Repository
注释)。