表不是使用 Derby 和 OpenJPA 生成的

Tables not generated using Derby and OpenJPA

即使我将属性 javax.persistence.schema-generation.database.action 设置为 create 并将连接字符串 javax.persistence.jdbc.url 设置为 jdbc:derby:db;create=true[=19=,也不会在数据库中生成

Table ]

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
    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 https://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="DataLayer"
        transaction-type="RESOURCE_LOCAL">
        <non-jta-data-source>DataSource</non-jta-data-source>
        <properties>
            <property
                name="javax.persistence.schema-generation.database.action"
                value="create" />
            <property name="javax.persistence.jdbc.driver"
                value="org.apache.derby.jdbc.EmbeddedDriver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:derby:db;create=true" />
        </properties>
    </persistence-unit>
</persistence>

我的测试方法:

HashMap<String, String> jpaProps = new HashMap<String, String>();
jpaProps.put("javax.persistence.jdbc.url", "jdbc:derby:db;create=true");
jpaProps.put("javax.persistence.jdbc.driver", "org.apache.derby.jdbc.EmbeddedDriver");
jpaProps.put("javax.persistence.schema-generation.database.action", "create");
EntityManagerFactory factory = Persistence.createEntityManagerFactory("DataLayer", jpaProps);
EntityManager manager = factory.createEntityManager();
EntityPerson person = new EntityPerson();
person.setAge(25);
person.setName("Michael Pear");
manager.getTransaction().begin();
manager.persist(person); 
manager.getTransaction().commit(); //<- Exception here saying EntityPerson Table does not exist.

如您所见,我还尝试通过将属性提供给 createEntityManagerFactory 方法来覆盖属性。

我的实体人 class:

@Entity
public class EntityPerson
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(nullable = false)
    private String name;
    
    private int age;
    
    ... getters and setters
}

还尝试明确定义 Table 带有注释的名称和实体名称:

@Entity(name = "EntityPerson")
@Table(name = "EntityPerson")

如何通过启动程序(在运行时)通过带注释的 classes 在 db 中生成表?

  1. 您配置了一个 <non-jta-data-source>DataSource</non-jta-data-source>,JPA 将尝试从此配置的 DataSource 加载数据源。
  2. 尝试使用相对路径(./)或/xxx在使用嵌入式数据库时存储临时数据。

我不确定这些是否解决了您的问题,persistence.xml 中的 create 值没问题。

Eclipse cargotrakcer is the official reference application, in the Java EE 7 为 GF/Payara 使用了 derby 配置。在最新的 Jakarta EE 8 中,它切换到使用自定义数据源。

Java EE 可以自动发现实体,但因为我正在构建桌面应用程序。使用 Java SE,我需要在 persistence.xml 文件中提及持久性单元中的实体,如下所示:

<class>entities.EntityPerson</class>