2011-11-28 236 views
1

我想在應用程序部署過程的第一時間創建數據庫。我正在使用JPA。所以我考慮兩種方法。JPA:創建數據庫然後連接

1)我有一個完整的連接描述我的persistence.xml:

<property name="mysql.jdbc.user" value="root"/> 
<property name="mysql.jdbc.password" value=""/> 
<property name="mysql.jdbc.url" value="jdbc:mysql://localhost:3306/DB"/> 
<property name="mysql.jdbc.driver" value="com.mysql.jdbc.Driver"/> 

當應用程序啓動時,它無法連接到數據庫,並報告有關這個麻煩建議去安裝頁面。在這個安裝頁面中,我使用顯式SQL查詢啓動數據庫創建。

2)我有一個數據庫服務器的連接:

<property name="mysql.jdbc.user" value="root"/> 
<property name="mysql.jdbc.password" value=""/> 
<property name="mysql.jdbc.url" value="jdbc:mysql://localhost:3306/"/> 
<property name="mysql.jdbc.driver" value="com.mysql.jdbc.Driver"/> 

的應用程序告訴我,這是第一個連接錯誤和重定向我安裝頁面。在數據庫安裝期間,應該修改persistence.xml。屬性mysql.jdbc.url必須被更改爲聲明數據庫名稱的新值賦值。

您對此有何看法?這個怎麼做?

+0

如果您正在測試,則可以使用H2創建數據庫並在測試用例啓動時生成模式。如果您對此感興趣,請告訴我,我會發布更詳細的解決方案。 – Fil

回答

0

您可以做的是添加一個配置爲在應用程序啓動時運行(一次)的servlet。這個servlet可以檢查數據庫是否已經存在,如果不存在,以編程方式創建它。查看this question's answers以瞭解MySQL如何實現。如果您有一個正在運行的服務器,則可以獲取連接並運行SQL以創建數據庫。之後,必要的表格之類可以使用您的JPA實現的正確屬性自動創建(如Nulldevice針對Hibernate所展示的)。

你甚至可以讓servlet找到persistence.xml文件,因爲它應該是在特定的位置,並解析它以找出像URL這樣的幾個屬性,以確保它們只在一個地方定義。

我不確定JPA是否會在運行servlet之後嘗試連接(並可能創建表),或者如何強制這樣做。爲此,您可能需要檢查JavaEE應用程序的生命週期。它也可能取決於應用服務器供應商的實現。

3

我幾乎可以肯定你不能使用JPA來創建數據庫本身。

您需要手動創建它或使用構建工具(如Maven)來創建它。

1

可能你應該使用persistence.xml創建數據庫。例如,對於JBoss,此屬性如下所示:

<property name="hibernate.hbm2ddl.auto" value="create-drop"/> 

也請查找其他可能的值。

+0

這是Hibernate特有的屬性。如果它在JBoss中有效,那僅僅是因爲它使用Hibernate作爲JPA實現。它可以在你使用Hibernate的任何時候工作。你的回答是正確的,只要確定它不是JBoss特有的即可。 –

+0

你的評論是正確的。我的想法是,框架在persistence.xml中有一個屬性,我只是舉了一個例子。 – Nulldevice