java - JPA:通过覆盖数据源在 JSE 和 JUnit 中重用 persistence.xml 和 jta-data-source
问题描述
我有这个peristence.xml
部署在 WildFly 上:
<persistence-unit name="optaweb-employee-rostering-persistence-unit" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
...
</persistence-unit>
现在我想在一个普通的 Java 应用程序中重用它,使用直接的 JDBC 连接,所以没有 JNDI:
Map<String, String> properties = new HashMap<>();
properties.put("javax.persistence.jdbc.driver", "org.hsqldb.jdbcDriver");
properties.put("javax.persistence.jdbc.url", "jdbc:hsqldb:mem:testdb");
properties.put("javax.persistence.jdbc.user", "sa");
properties.put("javax.persistence.jdbc.password", "");
// Overwrites transaction-type successfully
properties.put("javax.persistence.transactionType", "RESOURCE_LOCAL");
// TODO overwrite jta-data-source
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(
"optaweb-employee-rostering-persistence-unit", properties);
我该如何覆盖jta-data-source
?
我尝试了许多 JPA 属性来覆盖jta-data-source
,但没有成功:
// Overwrites jta-data-source
// but triggers a JNDI lookup of "" which crashes of course
properties.put("javax.persistence.jtaDataSource", "");
// Does not overwrite jta-data-source
properties.put("javax.persistence.jtaDataSource", null);
// Does not overwrite jta-data-source
properties.put("javax.persistence.nonJtaDataSource", "foo");
我还尝试了一些休眠特定属性,例如hibernate.transaction.coordinator_class
和hibernate.connection.datasource
上面相同的失败结果。
解决方案
据我所知,从 Hibernate ORM 的来源(特别是org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl#EntityManagerFactoryBuilderImpl(org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor, java.util.Map, java.lang.ClassLoader, org.hibernate.boot.registry.classloading.spi.ClassLoaderService)
)来看,这些特定的 JPA 设置会覆盖hibernate.properties
您将提供给Persistence.createEntityManagerFactory
.
这可能是一个愚蠢的想法,但你不能做相反的事情,即不在你的持久性单元中设置数据源,而是通过hibernate.properties
你的 WildFly 应用程序中的一个文件来设置它?然后你可以在你的普通 java 应用程序中做任何你想做的事情。
推荐阅读
- android - 通过命令行为 android 构建我的 Unity 项目的简单命令
- swift - 当您可以访问同一文件中的类时,Swift 为什么要使用扩展?
- apache-flink - Flink KeyedProcessFunction 不向后续步骤发送数据
- swift - 获取 MIDIObjectPropertyChangeNotification 返回的属性值
- sql-server - 使一个记录的最后一个日期成为存储过程中下一个记录的第一个日期
- swift - (不能分配给属性:“_products”是一个“让”常量)
- firebase - 无法将 React Native(Expo)中的图像上传到 Firebase 存储:TypeError:_firebase.default.storage 不是函数
- brain.js - 我应该使用什么 Brainjs 模型来预测质量趋势(软件)
- bash - MySQL bash语句中的特殊字符导致失败
- python - 任何人都可以帮助解决我的 python 批处理文件的问题吗?CMD首先显示空白屏幕