利用 Grails 重用您的 Hibernate/JPA 域模型

工程 | Peter Ledbrook | 2010 年 8 月 26 日 | ...

這是一個常見的故事。您已經有一個現有的資料庫,現在希望以最簡單的方式為它新增一個 Web 應用程式。Grails 能勝任這項任務嗎?當然可以!更好的是,如果您已經擁有一個基於 JPA 或 Hibernate 配置檔案構建的域模型,您可以重用它,並且仍然可以受益於您所熟悉的強大的 GORM 功能。

重用現有領域模型的第一步是獲取應用程式類路徑上的類檔案。您可以透過將它們打包到 JAR 檔案中並將其包含在應用程式中(通常是將其放入 'lib' 目錄),或將原始檔放入 'src/java' 目錄來實現。當在應用程式之間共享模型時,JAR 檔案是更好的方法,但這需要一個多專案構建系統來確保 JAR 對於所有專案始終是最新的。這可能值得付出額外的努力,而且 Gradle 和 Maven 都有用於構建 Grails 專案的外掛。或者,如果您的 Grails 應用程式是唯一使用該模型的專案,則應將源保留在 'src/java' 中。

一旦您決定如何整合領域模型,就需要告訴 Grails。這取決於您是使用 Hibernate 配置檔案還是 JPA 註釋。

XML 配置檔案

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。令人驚訝的是,您只需要做這些!那麼關於註釋模型呢?

JPA 註釋

與 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 領域模型,我很想聽聽您的經驗。任何能幫助其他想走這條路的使用者的事情都將不勝感激!

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有