表不是使用 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 中生成表?
- 您配置了一个
<non-jta-data-source>DataSource</non-jta-data-source>
,JPA 将尝试从此配置的 DataSource 加载数据源。
- 尝试使用相对路径(
./
)或/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>
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 中生成表?
- 您配置了一个
<non-jta-data-source>DataSource</non-jta-data-source>
,JPA 将尝试从此配置的 DataSource 加载数据源。 - 尝试使用相对路径(
./
)或/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>