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

时间:2016-06-07 19:51:48

标签: eclipse jpa java-ee wildfly-10

我应该检查服务器启动时是否存在表。如果它们不存在,我必须使用实体类创建它们。这甚至可能吗? 我正在使用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>

如果没有上述属性,我的数据库查询将抛出异常。但真正奇怪的是,使用此属性查询返回空列表,但数据库中不存在表。 此外,我注意到服务器启动时出现警告

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

我尝试了在stackoverflow和其他网站上发现的此警告的各种修复程序,但它们没有帮助。我甚至不知道这是否与我的问题有关

2 个答案:

答案 0 :(得分:2)

这可能取决于您在项目中的实施情况。假设您正在使用hibernate进行持久化,那么您需要添加以下内容:

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

请注意,这将假定您的连接是由在db创建表中具有所需权限的用户形成的。看看hibernate docs here

答案 1 :(得分:2)

JPA 2.1使DDL生成成为规范的一部分。您可以将“javax.persistence.schema-generation.database.action”持久性属性与“create”值一起使用,以使2.1提供程序在部署期间为您创建数据库架构。如果您需要修改表创建/拆除和填充过程,JPA可用于生成甚至运行自定义脚本。

您可能遇到的问题是您的持久性单元未指定数据源,将其留在容器中以确定要连接的数据源,并且Wildfly必须默认为H2数据库。这些表将在此数据库中设置,但不是您期望的Oracle XE数据库 - 这就是为什么查询不返回任何值,而在控制台中,表甚至不存在。

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