2011-02-01 62 views
1

是否有可能有一個領域的對象引用非主在另一個對象上的密鑰(我正在使用遺留數據庫)。在GORM中使用非主鍵作爲對象屬性?

我所擁有的是flea_name而不是flea_id(這是主鍵)。有沒有辦法讓GORM自動從跳蚤桌上拉出正確的跳蚤對象,而非基於非主要的鑰匙(如姓名,代碼等)而不是其ID? 如:

class Flea { 
     def id //This is the primary key in the table 
     def name //This is a unique key 
    } 

    class Puppy { 
     def flea //This is stored as the flea's unique, but non-primary, 
       // name in the puppy table 
       //The puppy table has a flea_name, not a flea_id, as would be expected 
     static mapping = { 
      flea column: 'flea_name'//This will point to the flea's name, 
            //but I want to hydrate it to be a Flea 
     } 
    } 

在此先感謝

回答

2

簡短的回答:你不這樣做。

你讓grails使用id鏈接數據庫中的對象。那麼如果您需要訪問跳蚤名稱,則可以覆蓋其toString()方法以返回跳蚤名稱。或者像控制器/服務或gsps中的其他任何其他資源一樣訪問該屬性。

+0

啊,所以你'正在處理傳統數據庫......這個我沒有理解你的問題。也許一個自定義的hibernate映射將會訣竅。但是,老實說,idk和我不想谷歌它... sry。 – 2011-02-02 17:54:02

2

你能否詳細說明爲什麼你要這麼做?如果對象關係真的是Puppy HAS A Flea,那麼你真的想通過Id鏈接正常。然而,如果你真正的意思是一隻小狗有很多跳蚤,那麼它可能會有一個單獨的跳蚤集合,或者更有可能在這種情況下,你並不真正想在這裏建立關係,而是Puppy有一個數字字段,用於識別它擁有的跳蚤數量。

這聽起來怎麼樣?

+0

對不起,「號」是不是跳蚤的狗的數量,但跳蚤的特定數量一次性的情況。我已將其更改爲「名稱」。此外,其原因是因爲我們正在創建一個新的中間表,數據團隊加載的方式是使用代碼/自然鍵,而不是對象的id(因爲它們在不同的環境中是相同的) 。 – Igor 2011-02-01 22:09:05

+0

我看到 - http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.5.2.4%20Custom%20Database%20Identity描述了用hibernate自定義ID和hibernate有一個'assigned'生成器,它讓應用程序在調用save()之前爲對象分配一個標識符。「也許這會幫助你使用'name'屬性作爲主鍵?還沒有嘗試過自己。另一個選擇是可能使用JPA定義這些實體並使用來自grails的實體http://blog.springsource.com/2010/08/26/reuse-your-hibernatejpa-domain-model-with-grails/ – Paul 2011-02-01 22:49:40

0

因此,一些經過研究,我的結論是,這個功能是不可能的Grails的。

我試圖通過flea_name映射,但它嘗試獲取新對象時會引發異常。

我用這個解決方法是創建一個方法:

def getFlea() { 
    Flea.findByName(flea) 
} 
-1

如果跳蚤在以這種方式一致地使用,換句話說,它不是一次性的。致使該人表還具有flea_name爲外鍵爲什麼不

static mapping = { 
    id generator: 'assigned', name: 'name' 
} 

根據版本的Hibernate/Grails的你是,你可能會失去進入實際ID列。

或者,如果這是你可以改變小狗

class Puppy{ 
    String fleaName 

    static transients = ['flea'] 

    Flea getFlea() { 
     Flea.findByName(fleaName) 
    } 
}