我找到了一个可以接受的解决方案。看下面。
我想使用 Kundera 作为我的持久性提供程序,将我的 JPA 对象存储在 HBase 中。我以注释驱动的方式做所有事情,即我没有也不想要持久性.xml。
到目前为止,我做了以下工作:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
bean.setPersistenceProviderClass(KunderaPersistence.class);
final Properties props = new Properties();
props.setProperty("kundera.dialect", "hbase");
props.setProperty("kundera.client.lookup.class",
HBaseClientFactory.class.getName());
props.setProperty("kundera.cache.provider.class",
EhCacheProvider.class.getName());
props.setProperty("kundera.cache.config.resource",
"/ehcache.xml");
props.setProperty("kundera.ddl.auto.prepare", "update");
props.setProperty("kundera.nodes", "myhbase.example.com");
props.setProperty("kundera.port", "2182");
props.setProperty("kundera.keyspace", "foo");
bean.setJpaProperties(props);
return bean;
}
我有一个ehcache.xml
,在我的src/main/resources
中有一个默认的配置。
当我尝试运行它时,它会纾困,堆栈跟踪归结为:
... many more ...
Caused by: java.lang.IllegalStateException: No persistence units parsed from {classpath*:META-INF/persistence.xml}
at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.obtainDefaultPersistenceUnitInfo(DefaultPersistenceUnitManager.java:655)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.determinePersistenceUnitInfo(LocalContainerEntityManagerFactoryBean.java:358)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:307)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
... 152 more
当我通过bean.setPersistenceUnitName("foo");
设置持久性单元名称时,我得到:No persistence unit with name 'foo' found
做错了什么,我真的需要坚持吗.xml?我不想要一个,因为我希望能够通过命令行开关设置配置。这些入到Environment
中,我可以将其用作@Bean
方法的参数,并以这种方式放入我的属性对象中。
---编辑---
现在,我创建了一个具有基本设置的persistence.xml
,只需覆盖Properties
对象中的自定义设置即可。这有效,但现在我有另一个问题,连接到 HBase 会严重锁定 Java 进程,我不得不杀死 -9 它。另一个问题随之而来。
正如我在原始编辑中所说,我找到了一个可接受的解决方案:
- 使用默认设置创建持久性.xml
- 重写@Bean方法中的自定义设置