2012-09-07 26 views
6

我的web框架(Play 1.2.5)創建了一個本地EJB3Configuration,它使用它來創建一個EntityManagerFactory(source)。我正在研究一個腳本,並希望從配置中運行generateSchemaUpdateScript()方法來製作SQL腳本,我可以在生產部署中驗證並運行該腳本。我遇到的問題是我無法弄清楚如何在構建EntityManagerFactory之後訪問使用的Configuration對象或如何生成配置對象。如何在EntityManagerFactory生成後獲得Hibernate配置?

+0

我建議與DBA討論任何可用的模式工具。他們可能能夠爲您複製架構或提供腳本。 – MarkOfHall

回答

7

你不能得到配置對象從EntityManagerFactory的回來,因爲Hibernate實現EntityManagerFactoryImpl不成立的配置對象

你的選擇是

  • 複製從JPAPlugin代碼在你的腳本來創建一個參考你自己的配置對象
  • 配置hibernate工具來處理你的類。我從來沒有使用過這個工具自己,但我想,正確配置,他可以爲您生成DDL
  • 從數據庫
2

產生回DDL腳本一旦實體管理器工廠已經創造了你不應該有配置對象的句柄,部分原因是配置應該表現出不可改變的行爲,因爲你不能改變它的屬性。

我指到Hibernate 3.6.8源和EJB3Configuration類有方法,不贊成使用其所有功能移動到配置類

public AnnotationConfiguration getHibernateConfiguration() { 
     //TODO make it really read only (maybe through proxying) 
     return cfg; 
    } 

AnnotationConfiguration聲明。

所以我認爲使用它你可以在你的配置被創建後得到句柄。您必須非常小心,儘管不要在該配置中更改任何內容。

這的javadoc解釋here

#buildEntityManagerFactory()被調用後,你不再能 更改配置狀態(無級添加,無屬性變化 等)

說了這麼多,你要實現的目標做的東西是嚴格不建議特別是對生產數據庫。請參閱here

Hibernate具有一個名爲「hibernate.hbm2ddl.auto」的屬性,該屬性用於在演變腳本的情況下協助模式自動生成。你正在努力實現編程有同樣的效果如給它在你的持久XML 更新像下面的值。實際上,當您具有「hibernate.hbm2ddl」的值時,generateSchemaUpdateScript方法將由配置調用。汽車」設置爲‘更新’

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="xyz" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
      .................... 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      ...................... 
     </properties> 
    </persistence-unit> 
</persistence> 

您可以參考其他可能值這個屬性here

然而在Hibernate文檔stricltly建議不要使用此對生產數據庫。

的權威書籍休眠 「與Hibernate的Java持久」 提醒人們這

警告我們已經看到了喜bernate用戶試圖使用SchemaUpdate至 自動更新生產數據庫的模式。這可能會在災難中迅速結束,並且不會被DBA允許。

,也對更新模式處理一些限制

此配置屬性的附加選項,更新,可以在開發過程中 有用的:它使內置SchemaUpdate工具對, 從而可以使架構演變更容易。如果啓用,Hibernate會在啓動時讀取JDBC數據庫元數據 ,並通過比較舊架構與當前映射 元數據來創建新表和 約束。請注意,此功能取決於JDBC驅動程序提供的元數據的質量,這是缺少許多驅動程序的區域。在實踐中,這個功能因此不那麼令人興奮,並且比起聽起來有用。

更新1:如果您沒有訪問EJB3Configuration和你的最終目的是創造JPA註明實體的更新模式腳本,那麼你可以以編程方式創建使用的持久性在Java主類的EJB3Configuration包含數據庫配置細節的xml文件並運行模式導出工具。請參閱this示例,瞭解如何執行此操作。因此,您可以通過這種方式在您的框架之外甚至容器之外的JPA實體上運行該工具。

更新2

的示例代碼中列出here顯示播放應用程序創建數據庫遷移時,你可以如何使用Hibernate架構更新。看起來像這就是你想要的!

+1

由於我無法控制的原因,我無法訪問EJB3Configuration實例,所以我無法從中獲取配置。我同意你的額外建議,我目前的計劃是針對我的開發數據庫運行generateSchemaUpdateScript(),並檢查更新sql並讓我的DBA在驗證它之後運行它。 –

+0

如果有幫助,請參閱我上面的更新! – Shailendra

+0

我在「更新2」部分添加了一個鏈接,看起來像做你想做的事情! – Shailendra

相關問題