2016-06-07 73 views
0

我应该检查服务器启动时是否存在表。如果它们不存在,我必须使用实体类创建它们。这甚至有可能吗? 我使用Eclipse,我的服务器是wildfly10。我连接到Oracle 11g XE,但我不认为这是导致问题如何在服务器启动时从JPA中的实体类创建表?

反正数据库,这是我迄今所做

我的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 

我尝试过各种修复此警告在计算器和其他网站上找到,但他们并没有帮助。我甚至不知道这是否与我的问题有关

回答

2

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

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

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

+0

我在Wildfly中指定了数据源,并将它添加到标记后,它现在可以按照预期工作(几乎)。你知道如果我可以避免异常被抛出,如果表已经存在?我不想使用drop-and-create becouse,如果它已经存在,我不想删除任何数据 – newfolder

2

这可能取决于您在项目中包含的实施。假设你正在使用Hibernate的持久性,则需要添加以下内容:

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

注意,这会假设你的连接,通过具有在该数据库的表创建所需的权限的用户形成。看看休眠文档here

相关问题