搶佔先機
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 這是一個基於註解的模型,方法是將以下內容新增到grails-app/conf/DataSource.groovy:
dataSource {
configClass = "org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration"
...
}
對於 Grails 1.2+,您無需執行此操作,因為GrailsAnnotationConfiguration是這些版本中的預設設定。 下次執行您的 Grails 應用程式時,您將可以訪問所有帶註釋的域類。
注意 自 1.3.2 版本以來,您可以使用 Grails 命令create-hibernate-cfg-xml為您生成 Hibernate 配置檔案。 節省打字/複製貼上!
從 GORM 的角度來看,域模型中仍然存在一個明顯的差距:約束。 您無法在 Java 類中定義它們,但如果沒有它們,GORM 驗證將毫無用處。 幸運的是,您可以透過新增一個package.DomainClassConstraints.groovy指令碼到 'src/java' 來將約束元資料附加到類。 例如,如果您有一個域類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”目錄是唯一滿足此要求的位置。
在您的 Grails 應用程式中合併 Java 域模型確實非常簡單。 您可能會失去標準 GORM 域類的優雅和自定義對映,但您仍然可以使用動態查詢器、條件查詢、驗證等。 那麼腳手架呢? Grails 將盡力為您域模型構建腳手架,但不做任何保證。 只要模型簡單,腳手架應該可以正常工作。 重用域模型也是嘗試 Grails 的好方法,因為您不必從頭開始建立一個。
請注意,如果您只想訪問舊資料庫並且沒有現有的域模型,那麼您幾乎肯定最好使用帶有自定義對映的標準 GORM 域類。 這兩種方法都在使用者指南中記錄:Hibernate 對映和自定義對映 DSL。
最後一點:如果您在自己的 Grails 專案中使用過 Java 域模型,我很想聽聽您的經驗。 任何可以幫助其他想要走這條路的使用者的東西,我都會非常感謝!