我有一個mysql數據庫,我想添加將新表添加到數據庫的功能。我可能很容易找到這個JPQL的例子,但是我怎麼會自動生成這個新表的實體,以便我可以在我的JPA代碼的其餘部分引用它來更新和從表中刪除,我通常引用實體而不是實際的表本身。Java EE/JPA將新表/實體添加到數據庫的方式
我現在擁有的實體我已經使用eclipe從我創建的表中生成。但是在部署之後,我們顯然不會讓Eclipse來完成這個任務,所以我們需要在每次創建表時自動完成。
我有一個mysql數據庫,我想添加將新表添加到數據庫的功能。我可能很容易找到這個JPQL的例子,但是我怎麼會自動生成這個新表的實體,以便我可以在我的JPA代碼的其餘部分引用它來更新和從表中刪除,我通常引用實體而不是實際的表本身。Java EE/JPA將新表/實體添加到數據庫的方式
我現在擁有的實體我已經使用eclipe從我創建的表中生成。但是在部署之後,我們顯然不會讓Eclipse來完成這個任務,所以我們需要在每次創建表時自動完成。
動態創建和映射新表並不是JPA支持的。它需要即時創建新的Java類並動態更新映射元數據。您可以使用JDBC或本機查詢完成您想要的任何操作。但是,也許你應該解釋爲什麼你需要動態創建新表格。
您可以配置您的hibernate屬性或persistence.xml來更新服務器啓動時的db。它會自動更新表格。看看hibernateDialect參數旁邊的 。
<property name="hibernate.hbm2ddl.auto" value="update" />
是你想要的。 我不認爲你想立即創建實體類,並且希望在不重新部署的情況下創建表,因爲@JB Nizet在他的回答中說。
有幾種創建表格的方法。生產使用最常見的是DBA(或該角色的開發人員)獨立於應用程序創建數據庫模式(表等)。
這是典型的,因爲應用程序會在數據庫中對數據進行建模,並且有一種常見的看法認爲數據庫通常超過應用程序。
可以讓JPA提供程序自動創建模式。 JPA註釋中甚至有幾個屬性專門用於此目的(例如nullable
屬性JoinColumn
)。
在persistence.xml中激活這種情況會發生在特定於提供者的屬性中。例如。用於Hibernate的hibernate.hbm2ddl.auto
(用於JBoss AS)和用於EclipseLink的eclipselink.ddl-generation
(用於GlassFish)。
查看http://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/JBoss的一些例子。
在表格中插入實體是完全不同的事情。從你的問題不知何故,你會覺得你可能不完全明白這兩者之間的區別。它通過例如EntityManager#persist
,但我不是100%確定,如果這是你問的。
我不知道我需要經常創建表格。我認爲如果你正確地創建你的模式,你應該創建新的表。但如果我們做到了,我總是可以重新制作服務器項目,並使用新的映射進行部署。我只是想知道是否有可能,因爲有人問我是否可以做到。 – Randnum 2011-12-27 23:02:43
要添加新映射,您的確必須重新部署應用程序的新版本。您可能還必須執行一些模式遷移腳本,因爲這個新表很可能會影響現有模式(新外鍵,設計更改等)。只需確保在生產服務器上執行整個過程之前先測試整個過程,以確保停機時間儘可能短。 – 2011-12-27 23:06:14
好點。儘管我認爲至少對於我提出的問題,這些表格將獨立於沒有關係和關鍵的其他表格。但要生成實體,我必須重新部署,所以它仍然是一個壞主意。 – Randnum 2011-12-27 23:15:51