问题描述
即使我将属性 javax.persistence.schema-generation.database.action
设置为 create
并将连接字符串 javax.persistence.jdbc.url
设置为 jdbc:derby:db;create=true
也不会在数据库中生成表
持久性.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
方法来覆盖属性。
我的 EntityPerson 类:
@Entity
public class EntityPerson
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false)
private String name;
private int age;
... getters and setters
}
还尝试使用注释明确定义表名和实体名:
@Entity(name = "EntityPerson")
@Table(name = "EntityPerson")
如何通过启动程序(在运行时)通过带注释的类在数据库中生成表?
解决方法
- 您配置了
<non-jta-data-source>DataSource</non-jta-data-source>
,JPA 将尝试从此配置的数据源加载数据源。 - 在使用嵌入式数据库时,尝试使用相对路径(
./
)或/xxx
来存储临时数据。
我不确定这些是否解决了您的问题,create
中的 persistence.xml
值没问题。
Eclipse cargotrakcer 是官方参考应用程序,在 Java EE 7 中使用了 GF/Payara 的 derby 配置。在最新的 Jakarta EE 8 中,它切换到使用自定义数据源。
,Java EE 可以自动发现实体,但因为我正在构建桌面应用程序。使用 Java SE,我需要在 persistence.xml 文件中的 persistence-unit 中提及实体,如下所示:
<class>entities.EntityPerson</class>