从外部源定义 JPA 配置

Define JPA configuration from external source

我经常在命令行 java 应用程序中使用 JPA。使用应用程序服务器,我可以通过 persistence.xml 中的 <jta-data-source>jdbc/myDatabase</jta-data-source> 轻松地 link 到外部配置。如果没有应用程序服务器,这怎么可能?我可以找到有关属性 <non-jta-data-source/> 的一些信息。但是我怎样才能优雅地引用外部文件(可能是属性格式)中的值呢?样板代码越少越好。

我在这里找到了解决这个问题的方法,但我认为还有一种更优雅的方法: JPA Desktop application

在桌面应用程序中使用 JPA 很容易。这几乎是一回事,但您需要管理交易。由于您没有应用程序服务器,每笔交易的管理都必须由您来完成。可以通过 EntityManagerFactory 访问您的 JPA 单元。

示例:

EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("jpa-example");
EntityManager em = emFactory.getEntityManager();
em.getTransaction().begin();
em.persist(address);
em.getTransaction().commit();

您需要将 persistence.xml 文件放在 META-INF 文件夹下。您需要在持久性配置文件中指出事务类型是 RESOURCE_LOCAL。这是 运行 独立需要的,没有应用程序服务器:

<persistence-unit name="jpa-example" transaction-type="RESOURCE_LOCAL">

但是,您需要下载并 link 项目类路径中的库。您将需要 JTA jar 和您的持久性提供程序 JAR,它们可以是 Hibernate 或您选择的任何其他供应商的。这可以用 Maven 干净地实现。

您可能需要查看此教程: http://java.dzone.com/articles/jpa-tutorial-setting-jpa-java

现在我正在使用这个解决方案:

我需要一个如下所示的属性文件:

javax.persistence.jdbc.url = jdbc:mysql://localhost:3306/database
javax.persistence.jdbc.user = root
javax.persistence.jdbc.password = root
javax.persistence.jdbc.driver = com.mysql.jdbc.Driver

尊重这个方案允许我以后使用没有任何映射的值。然后我可以像这样轻松地将值传递给创建 EntityManagerFactory:

try (final InputStream jpaFileInput = Files.newInputStream(propFile)) {
    final Properties properties = new Properties();
    properties.load(jpaFileInput);
    emf = Persistence.createEntityManagerFactory(PU_NAME, properties);
}