我和我的同事在使用 Archetype 的 airhacks java EE 8 项目创建简单的测试应用程序时遇到了不一致的行为。
我们创建一个简单的 POJO 并使用 Entity 注释对其进行标记,例如
@Entity
public class GroceryItem { ... }
在 Apache NetBeans 12 中,@Entity 有一个警告下划线。当我们选择警告(或按 Alt+Enter)时,我们会看到一个“创建持久性单元”选项,我们单击该选项。
但是,我能够做到这一点。
我选择 jdbc:derby:// 选项,点击 Create,然后它在 Other Sources ... META-INF 中创建了persistence.xml文件,正如我所料。这是原始的 persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="somePU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/sample"/>
<property name="javax.persistence.jdbc.user" value="app"/>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
<property name="javax.persistence.jdbc.password" value="app"/>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
</properties>
</persistence-unit>
</persistence>
我修改它以使用JTA并删除对大多数属性的引用,结果如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="somePU" transaction-type="JTA">
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
</properties>
</persistence-unit>
</persistence>
请注意,我已将事务类型属性从“RESOURCE_LOCAL”更改为“JTA”。
现在,我只需转到命令行并使用
mvn package
然后我用 Payara 运行它:
java -jar payara.jar --deploy "path-to-the-war-file" --port 8080
我看到了预期的 Payara REST URL,它们运行良好。
但是,我的同事卡在“创建持久性单元”步骤。他们根本看不到 jdbc:derby://localhost... 选项。他们有和我一样的 Apache NetBeans,也有 Payara micro,就像我正在使用的一样。他们无法通过此过程创建 persistence.xml 文件。
我读到过,也许 Derby 在某些平台上已经放弃了支持,但我不明白为什么我的平台工作得很好,而他们的平台却没有给他们选择。
我对 Java/Apache NetBeans 的这一方面有点陌生(我在 Java SE、Android 上花了很多时间,甚至使用 ASP .NET Core MVC 为 REST 和 WSDL/SOAP 完成了 Web 服务,但这就是全部变得非常令人困惑。
所以,我的问题是:有没有人经历过这种行为并纠正了它,或者是否有有效的解决方法?通过 NetBeans 中的“新 XML 文件”创建一个 persistence.xml 似乎并不能解决问题——该图标甚至与选择“创建持久性单元”时的图标不同。这似乎很复杂,我自己无法重现他们的问题。
谢谢!