如何在服务器启动时从 JPA 中的实体 类 创建表?

How to create tables from entity classes in JPA on server Startup?

我应该在服务器启动时检查 table 是否存在。如果它们不存在,我必须使用实体 类 创建它们。这可能吗? 我正在使用 Eclipse,我的服务器是 wildfly10。我正在连接到 Oracle 11g xe,但我不认为是数据库导致了问题

无论如何,这就是我到目前为止所做的

我的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="Lab5">
        <properties>
            <property name="javax.persistence.schema-generation.database.action" value="create"/>
        </properties>
    </persistence-unit>
</persistence>

没有以上 属性 我的数据库查询抛出异常。但真正奇怪的是,用这个 属性 查询 returns 空列表,但 table 不存在于数据库中。 另外,我注意到服务器启动时显示警告

HHH000431: Unable to determine H2 database version, certain features may not work

我尝试了针对在 Whosebug 和其他网站上找到的此警告的各种修复,但它们没有帮助。我什至不知道这是否与我的问题有关

这可能取决于您在项目中包含的实现。假设您使用 hibernate 进行持久化,则需要添加以下内容:

...
<persistence-unit ...>
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  ...
  <properties>
    <property name = "hibernate.hbm2ddl.auto" value="create" />
    ...
  </properties>
</persistence-unit>

请注意,这将假设您的连接是与在数据库中具有创建 table 所需权限的用户建立的。查看休眠文档 here.

JPA 2.1 使 DDL 生成成为规范的一部分。您可以使用 "javax.persistence.schema-generation.database.action" 持久性 属性 和 "create" 值,让 2.1 提供程序在部署期间为您创建数据库模式。如果您需要修改 table creation/tear 向下和填充过程,JPA 可用于生成甚至 运行 自定义脚本。

你可能遇到的问题是你的持久化单元没有指定数据源,让容器决定你想连接到哪个,Wildfly 必须默认为 H2 数据库。 tables 将在此数据库中设置,而不是您期望的 Oracle XE 数据库 - 这就是为什么查询 return 没有值,但在您的控制台中,tables 不甚至不存在。

您需要在服务器中为您的数据库设置一个数据源,然后使用 <non-jta-data-source><jta-data-source> 将您的持久性单元指向它。你的 persistence.xml 不完整,所以我建议你先看一个演示持久性单元。