2013-05-27 30 views
1

我繼承了我需要維護的Grails 1.3.9項目。grails GORM:如何訪問超級類的ID

有一種情況需要對其中一個控制器進行擴展以記錄擴展約會的創建。

的約會的定義是這樣的:

class Appointment implements Serializable{ 

    static mapping = { 
     table 'appointment' 
     version false 
     tablePerHierarchy false 
     id generator:'sequence', params:[sequence:'seq_te_id'] 
     cache true 
     columns{ 
      id column:'te_id' 
      start column: 'te_start' 
      // Other columns follow 
     } 
    } 
    } 

特別約定:

class SpecialAppointment extends Appointment implements Serializable { 

    static mapping = { 
     table 'special_appointment' 
     cache true 
     columns{ 
      id column: 'pt_id' 
      comment column: 'pt_name' 
      // other columns 
     } 
    } 
} 

歷史日誌:

class AppointmentHistory { 
    static mapping = { 
     version false 
     table 'appointment_history' 
     id generator: 'sequence', params:[sequence:'seq_th_id'] 
     cache true 
     columns { 
      id column: 'th_id' 
      termin column: 'pt_id' 
      // other columns 
     } 
    } 
} 

在控制器創建SpecialAppointment,其任命爲基類,我需要創建並保存AppointmentHistory的新實例,其中哈與約會的關係。

def app = new SpecialAppointment() 
// set fields here 

app.save(flush:true) 

// save history log 
def history = new AppointmentHistory(appointment: app) 

我創造歷史對象時,通過實例SpecialAppointment的,但它是錯誤的,因爲它使用的ID,而不是任命的ID。

不幸的是,我無法弄清楚正確的語法從剛纔保存的派生類實例中訪問超類的成員。

請指教。

+0

這聽起來對我來說應該是一個組合而不是擴展 - SpecialAppointment不應該是Appointment的子類,而應該是一個單獨的類,它擁有一個Appointment的引用(可能不可空)。 –

+0

是的,以這種方式實現它可能會更好,但是這是更大應用程序的一部分,我寧願不更改這些關係。 顯式訪問超類的成員的正確語法是什麼? – matejk

回答

0

真正的問題是域類之間的關係沒有正確設置。

AppointmentHistory需要belongsTo AppointmentAppointment需要hasMany AppointmentHistory。歷史項目必須添加到約會app.addHistoryItem(history)

這些更改解決了問題。

感謝大家的支持。

0

Special Appointment作爲Appointment的子集只在表中生成一個對象和一行,因此它們具有公共ID。繼承不是一個關係,其中一個子對象包含超級對象,但是子對象IS也是超級對象。

換句話說,它使用SpecialAppointment的ID很好,因爲SpecialAppointment也可以是引用約會類對象

+0

我認爲SpecialAppointment應該有一個約會的參考。就像它在答案中所說的那樣,你沒有和Apointment和一個特殊任命,就是第二個。如果你想訪問一個特殊約會的相關約會,你必須同時存儲和引用這兩個項目 – Eylen

+0

約會沒有它自己的ID,他們有一個公共ID,因爲他們是一個對象(不是兩個) –

+0

@KamilMikolajczyk每個域類映射到它自己的表。在創建新的SpecialAppointment時,還會創建一個與Appointment相關的條目。並且都有id列。 (http://grails.org/doc/latest/guide/GORM.html#inheritanceInGORM) – matejk