Java 从外部源定义JPA配置

Java 从外部源定义JPA配置,java,jpa,Java,Jpa,我经常在命令行java应用程序中使用JPA。使用应用服务器,我可以通过persistence.xml中的jdbc/myDatabase轻松链接到外部配置。如果没有应用服务器,这怎么可能呢?我可以找到一些关于属性的信息。但是,如何以优雅的方式引用外部文件(可能是属性格式)中的值呢?如果有尽可能少的样板代码就好了 我在这里找到了一种方法,但我认为有一种更优雅的方法: 在桌面应用程序中使用JPA很容易。这几乎是相同的事情,但您需要管理事务。由于您没有应用服务器,因此必须由您管理每个事务。可以通过Ent

我经常在命令行java应用程序中使用JPA。使用应用服务器,我可以通过
persistence.xml
中的
jdbc/myDatabase
轻松链接到外部配置。如果没有应用服务器,这怎么可能呢?我可以找到一些关于属性
的信息。但是,如何以优雅的方式引用外部文件(可能是属性格式)中的值呢?如果有尽可能少的样板代码就好了

我在这里找到了一种方法,但我认为有一种更优雅的方法:

在桌面应用程序中使用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\u LOCAL。这是在没有应用服务器的情况下独立运行所必需的:

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

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

您可能希望查看本教程:

现在我正在使用此解决方案: 我需要一个如下所示的属性文件:

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
try (final InputStream jpaFileInput = Files.newInputStream(propFile)) {
    final Properties properties = new Properties();
    properties.load(jpaFileInput);
    emf = Persistence.createEntityManagerFactory(PU_NAME, properties);
}
遵循此方案允许我在以后使用这些值,而无需进行任何映射。然后,我可以像这样轻松地将这些值传递给EntityManager工厂:

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
try (final InputStream jpaFileInput = Files.newInputStream(propFile)) {
    final Properties properties = new Properties();
    properties.load(jpaFileInput);
    emf = Persistence.createEntityManagerFactory(PU_NAME, properties);
}

仅仅因为你没有应用服务器并不意味着你没有JTA。有独立的JTA提供商。你也可以使用JDBC URL/驱动程序等。似乎不是JPA,OP提及Shibernate是JPA规范的实现。我不想坚持使用某个实现。你可能想检查答案末尾提供的链接。Hibernate是JPA的实现,但你建议不使用JPA。您可以使用JPA轻松地更新您的答案。