領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多這是一個常見的故事。您已經有一個現有的資料庫,現在希望以最簡單的方式為它新增一個 Web 應用程式。Grails 能勝任這項任務嗎?當然可以!更好的是,如果您已經擁有一個基於 JPA 或 Hibernate 配置檔案構建的域模型,您可以重用它,並且仍然可以受益於您所熟悉的強大的 GORM 功能。
重用現有領域模型的第一步是獲取應用程式類路徑上的類檔案。您可以透過將它們打包到 JAR 檔案中並將其包含在應用程式中(通常是將其放入 'lib' 目錄),或將原始檔放入 'src/java' 目錄來實現。當在應用程式之間共享模型時,JAR 檔案是更好的方法,但這需要一個多專案構建系統來確保 JAR 對於所有專案始終是最新的。這可能值得付出額外的努力,而且 Gradle 和 Maven 都有用於構建 Grails 專案的外掛。或者,如果您的 Grails 應用程式是唯一使用該模型的專案,則應將源保留在 'src/java' 中。
一旦您決定如何整合領域模型,就需要告訴 Grails。這取決於您是使用 Hibernate 配置檔案還是 JPA 註釋。
Hibernate XML 對映檔案是老派的,但它們有一個優點,就是將所有對映資訊儲存在一個地方。要從您的 Grails 應用程式中使用它們,只需建立檔案grails-app/conf/hibernate/hibernate.cfg.xml幷包含內容
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping resource="org.example.Book.hbm.xml"/>
<mapping resource="org.example.Author.hbm.xml"/>
...
</session-factory>
</hibernate-configuration>
確保新增一個<mapping>元素,用於每個 Hibernate 對映檔案,並將這些對映檔案放入grails-app/conf/hibernate。令人驚訝的是,您只需要做這些!那麼關於註釋模型呢?
與 Hibernate 對映檔案一樣,您必須建立grails-app/conf/hibernate/hibernate.cfg.xml檔案。這次,您需要做更多的工作,因為您必須為每個域類新增一個<mapping>條目
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="org.example.Book"/>
<mapping class="org.example.Author"/>
...
</session-factory>
</hibernate-configuration>
。我承認這不太有趣,但至少您只需要做一次。
如果您使用的是 Grails 1.1.x 或更早版本,還有一項任務需要完成:您必須透過將以下內容新增到grails-app/conf/DataSource.groovy:
dataSource {
configClass = "org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration"
...
}
來告訴 Grails 這是一個基於註釋的模型。對於 Grails 1.2+,您不必這樣做,因為GrailsAnnotationConfiguration是這些版本的預設設定。下次執行您的 Grails 應用程式時,您將可以訪問所有註釋的域類。
注意 自 1.3.2 版本起,您就可以使用 Grails 命令create-hibernate-cfg-xml為您生成 Hibernate 配置檔案。節省了輸入/複製貼上的功夫!
從 GORM 的角度來看,領域模型仍然存在一個明顯的不足:約束。您不能在 Java 類中定義它們,但沒有它們,GORM 驗證就毫無用處。幸運的是,您可以透過在 'src/java' 中新增一個package.DomainClassConstraints.groovy指令碼來將約束元資料附加到類。例如,如果您有一個領域類org.example.LibraryBook,那麼您應該新增檔案src/java/org/example/LibraryBookConstraints.groovy。在此指令碼中,您像這樣定義約束塊
constraints = {
name(blank: false)
age(min: 0, max: 120)
...
}
您可能想知道為什麼指令碼會放在 'src/java' 目錄中。這是一個很好的問題。Grails 需要源形式的約束指令碼,所以您需要將其放在一個能讓 Grails 將.groovy檔案(而不是編譯後的類)包含在 WAR 中的位置。'src/java' 目錄是唯一滿足此要求的地點。
將 Java 領域模型整合到 Grails 應用程式中確實非常簡單。您可能會失去標準的 GORM 領域類的優雅和自定義對映,但您仍然可以使用動態查詢器、條件查詢、驗證等。那麼腳手架呢?Grails 會盡力為您生成領域模型的腳手架,但它不作任何保證。只要模型簡單明瞭,腳手架就應該能正常工作。重用領域模型也是嘗試 Grails 的好方法,因為您不必從頭開始建立它。
請注意,如果您只想訪問一個遺留資料庫而沒有現有的領域模型,那麼使用帶有自定義對映的標準 GORM 領域類幾乎肯定更好。這兩種方法都在使用者指南中有記錄:Hibernate 對映和自定義對映 DSL。
最後一點:如果您在自己的 Grails 專案中使用了 Java 領域模型,我很想聽聽您的經驗。任何能幫助其他想走這條路的使用者的事情都將不勝感激!