不是使用 Derby 和 OpenJPA 生成的表

问题描述

即使我将属性 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")

如何通过启动程序(在运行时)通过带注释的类在数据库生成表?

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...