2017-02-14 35 views
0

它說你可以把嵌入類放在與頂級父域類相同的域類文件中 - 這個從代碼的角度來看,它仍然會生成一個GeoAddress表,並且將這些列嵌入到源Venue表中。測試數據輸入到場地 - 地理地址表保持空白。grails v3.2.6/gorm嵌入類在同一個域中class.groovy在grails/gorms文檔中創建虛擬DB表

文檔意味着不應該生成此嵌入的表。我可以嘗試將GeoAddress移動到它自己的src/groovy文件中,因此它脫離了grails-app/domain文件夾,但是我必須'記住我已經完成了這個'。保持與包含類相同的文件會更「乾淨」。

除了將地理地址返回到完全域類本身 - 我如何告訴格姆姆當它被嵌入時不生成表格?

我在的grails-app venue.groovy /域文件夾類的名稱

class Venue { 

    String name 
    LocalDate dateCreated 
    LocalDate lastVisited 
    LocalDate lastUpdated 
    GeoAddress location 
    Collection posts 


    static hasMany = [posts:Post]   
    static embedded =['location'] 

    static constraints = { 
     lastVisited nullable:true 
     location nullable:true, unique:true 
     posts  nullable:true 
    } 
    static mapping = { 
     location cascade: "all-delete-orphan", lazy:false, unique:true 
     posts sorted: "desc", cascade:"save-update" 


    } 
} 


class GeoAddress { 

    String addressLine1 
    String addressLine2 
    String addressLine3 
    String town 
    String county 
    String country = "UK" 
    String postcode 

    //adds addTo/removeFrom methods to venue 
    static belongsTo = Venue 

    static constraints = { 
     addressLine1 nullable:true 
     addressLine2 nullable:true 
     addressLine3 nullable:true 
     town   nullable:true 
     county  nullable:true 
     country  nullable:true 
     postcode  nullable:true 
    } 
} 
+0

難怪,如果你嘗試過它作爲抽象類是否會工作,使事情同樣的嘗試將其聲明爲'abstract class GeoAddress' – Vahid

+0

它肯定不能是一個抽象類 - 因爲我必須創建它的實例才能添加到場地構造函數中。你不能有新的(),所以我不認爲這個工程。 –

+0

我不認爲你會找到你正在尋找的答案,如果你關心表創建集dbCreate - 是否從領域模型自動生成數據庫 - '創建 - 下降','創建','更新'或'驗證'我假設更新或者甚至驗證不創建然後運行'grails export-schema'並自己手動創建表格 – Vahid

回答

0

Grails的表生成的基礎上,儘量把嵌入爲集合,而不是類。

+0

它不能作爲一個集合1:1 - 場地有一個位置。所以這不會工作 –

0

我似乎已經發布了關於本質上相同的問題 - 粗心大意。另請參閱can't get cascade save nor delete on embedded class ref to work

但是重新出現。讓嵌入類位於grails-app/domain文件夾下的主類下方,並不會阻止生成嵌入類(正如它在文檔中所暗示的那樣)。

所以Gorm繼續併爲您創建一個Venue和一個GeoLocation(我的例子在這裏)。但是這種用法並不是我所期望的,這也是測試失敗的原因。

如果您將新的GeoLocation作爲構造函數arg添加到場地,則將瞬態實例保存在同一表中嵌入位置列的場地表中。如果刪除場地,整個行將從場地表中刪除。但是,如果您先創建一個GeoLoaction並保存()它 - 它實際上保存在GeoLocation表中,而不是保存在GeoLocation表中。然後將其添加到場地更新列場地表。

因此,當測試執行GeoLocation.list()/ get()時,它會在該表中找到該行,而不是在場地內查看嵌入的列。

找不到一個很好的出路。只有停止進入數據庫的geoLocation的方法是將定義移出域文件夾並放入src/groovy。但是,然後你的域模型被分割爲兩個子樹,並且獲得gorm驗證在域文件夾之外觸發更加容易實現。

我想我不得不接受使用GeoLocation作爲完整的域類而不是使用嵌入式 - 並接受加入成本。至少,模型/測試的工作方式如您所願。

結果是不確定的嵌入式是一個明智的決策模型,我會建議不使用,除非喲真的要

+0

'加入成本'與嘗試實現類似效果的過程相比,但如果您使用了諸如'String getAddressLine1(){return你可以快速訪問每個對象的'Venue'類中的location.addressLine1},然後使用hql地圖清楚地從場地連接位置獲取特定元素,從而選擇新地圖(v.name,l.addessLine1)場地v加入位置l這種方式的成本是最小的 - 正如我所說的,這些類型的連接過於常見與嵌入式難得的場景 – Vahid

+0

可能強調了錯誤的擔憂 - 我可以接受加入成本。我真正擔心的是,閱讀文檔後,我會理解同一個類文件中的第二個類(嵌入的一個)會停止表的生成,然後我不會有自己的location.save()本身的問題進入GeoLocation表格,但場館構造函數中的位置以嵌入場地表的方式正確存儲。這太令人困惑了,並且專注於應用程序 –

+0

,而不是最終花費時間來了解下面的內容 - 我不反對做一些學習,但是這樣做沒有用,因爲我讀過它和我失去了時間試圖找出原因。因此,儘量保持它儘可能簡單,並避免一些'更好的'功能,這會增加開發人員的混淆 –

0

好的 - 我沒有找到一種方法,使用地理定位爲嵌入式和停止它創建一個表。

我不得不將GeoLoction設置爲靜態內部類。當你這樣做並運行應用程序時,你不會在數據庫中獲得額外的虛假域名錶。它必須是靜態的內部類,因爲GeoLocation對約束有一個靜態聲明。

我不知道這是否是一個錯誤或什麼 - 但Grails文檔是在5.2節的建議不正確 - 在格姆組成,它說

如果在定義的地址類在 grails-app/domain目錄中分開單獨的Groovy文件,你也會得到一個地址表。如果您 不希望這種事情發生使用Groovy的每個文件定義多個 類能力,包括在grails-app /域的Person類 下面的地址類/ Person.groovy文件

修飾類如下所示。當你想創建的其中之一的格式(引導/測試)看起來像新的Venue.GeoLocation(...)

class Venue implements Serializable { 

    String name 
    LocalDate dateCreated 
    LocalDate lastVisited 
    LocalDate lastUpdated 
    GeoAddress location 
    Collection posts 

    //static hasOne = [location:GeoAddress] //, temp:TempLocation 
    static hasMany = [posts:Post]   //but doesn't really own thats with user 
    static embedded =['location'] 

    static constraints = { 
     lastVisited nullable:true 
     location nullable:true, unique:true 
     posts  nullable:true 
    } 
    static mapping = { 
     location cascade: "all-delete-orphan", lazy:false, unique:true //eager fetch strategy 
     posts sorted: "desc", cascade:"save-update" 

     //comment out for now 
     //posts joinTable: [name:"venue_posts", key:"venue_id", column:"posts", type:Post] 
    } 

    static class GeoAddress { 

     String addressLine1 
     String addressLine2 
     String addressLine3 
     String town 
     String county 
     String country = "UK" 
     String postcode 

     //adds addTo/removeFrom methods to venue 
     static belongsTo = Venue 

     static constraints = { 
      addressLine1 nullable:true 
      addressLine2 nullable:true 
      addressLine3 nullable:true 
      town   nullable:true 
      county  nullable:true 
      country  nullable:true 
      postcode  nullable:true, 
        matches: /^([gG][iI][rR] {0,}0[aA]{2})|([a-pr-uwyzA-PR-UWYZ](([0-9](([0-9]|[a-hjkstuwA-HJKSTUW])?)?)|([a-hk-yA-HK-Y][0-9]([0-9]|[abehmnprvwxyABEHMNPRVWXY])?)) ?[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2})$/ 
     } 
    } 
}