2011-06-17 42 views
4

我正在將我的grails項目從使用Hibernate XML遷移到在域類中定義的GORM。在一種現有的XML文件,規定了一個地圖:從休眠XML到GORM的Grails轉換

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="myproj" default-lazy="true"> 

    <class name="Season" table="seasons"> 
     <cache usage="read-only"/> 
     <comment>Season</comment> 
     <id name="id" type="long"> 
      <generator class="assigned"> 
      </generator> 
     </id> 

     <property name="seasonKey" column="season_key"/> 
     <many-to-one name="league" class="Affiliation" column="league_id"/> 
     <many-to-one name="publisher" class="Publisher"/> 

     // MAP STARTS HERE 
     <map name="seasonWeeks"> 
      <cache usage="read-write"/>   
      <key column="season_id"></key> 
      <map-key column="week" type="int"/> 
      <one-to-many class="SeasonWeek"/> 
     </map> 

    </class> 

</hibernate-mapping> 

正如你所看到的,它會創建一個映射整數,SeasonWeek的。此代碼先前正在運行。

當我嘗試在GORM中重新創建Map時,它不起作用。 Grails的1.3.7(在我的版本)文件規定:

靜態的hasMany屬性定義 的 地圖內的元素的類型。地圖的鍵必須是 字符串。

在我的情況下,我不希望地圖是一個字符串。問題:

  • 有沒有什麼辦法可以做我想要的?也許通過使用靜態映射var?
  • 如果不是,我必須恢復舊的Hibernate XML文件嗎?我可以爲我的項目中的一個域類執行此操作,而其餘的XML文件沒有?

謝謝。

回答

4

我發現試圖讓使用GORM的傳統應用程序在grails中工作的一些東西並不是最簡單的事情。您可以找到適合您99%問題的解決方案,但是您會花更多時間爲最後1%的問題(如您的問題)尋找簡單按鈕。我想你可以通過使用瞬態領域爲重點有些像(注有兩種解決辦法,我建議第二)做到這一點...

class Season { 

    static mapping = { 
     seasonWeeks mapKey: 'weekOfYearAsString' 
    } 

    static hasMany = [seasonWeeks:SeasonWeek] 

    Map seasonWeeks = [:] 
} 


class SeasonWeek{ 

     ... 

     String name 
     Integer weekOfYearAsInt 
     String weekOfYearAsString 

     String getWeekOfYearAsString(){ 
      return String.valueOf(weekOfYearAsInt); 
     } 

     void setWeekOfYearAsString(def value){ 
      this.weekOfYearAsInt = Integer.parseInt(value); 
     } 
    } 

ALSO你可以完全避免格姆(我會做什麼),並只處理您的季節類建設地圖...

class Season{ 

    ... 

    public Map getSeasonWeeksMap(){ 
     Map map = [:] 
     def seasons = SeasonWeek.findBySeason(this.id) 

     season.each(){season -> 
      map.put(season.id, season) 

     } 

     return map 
    } 
}