2016-06-07 93 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

相關問題