2015-11-05 107 views
0

我有一個Domain類,名爲Contact,具有多個hasMany關係,另一個Domain類別Employee,它是Concat的一部分。GORM映射視圖

Contact有一個表contact和員工應在查看它看起來像這樣映射:

SELECT * FROM contact where employee=1 

Employee應該有相同的列,比Contact關係,我怎麼寫域類? 我可以使用繼承嗎?

編輯

現在我已經使用的繼承像這樣:

class Employee extends Contact { } 
class Contact{ 
    static mapping = { 
    tablePerHierarchy(false) 
    } 
} 

,到目前爲止的工作,但現在我想給一些關係添加到Employee,像這樣:

class Employee extends Contact {  
    static belongsTo = [CostCenter ] 
    static hasMany = [costCenter: CostCenter] 
    static mapping = { 
    costCenter joinTable: 'employee_cost_center', column: 'employee_id' 
    } 
} 
class CostCenter { 
    static hasMany = [employees:Employee] 
    static mapping = { 
    employeesjoinTable: 'employee_cost_center', column: 'cost_center_id' 
    } 
} 

現在我有一個問題,表'employee_cost_center'參考Contact其中是好的,但也增加了「僱員標識」:

contact_id 
employee_id 
cost_center_id 

,所以我可以添加關係來接觸,但後來我在CostCenterContact而不是Employee

如何添加關係到Employee

+0

爲什麼必須'Employee'子類'Contact'?你需要繼承提供的多態性嗎? –

+0

我正在爲整個問題尋找一個好的解決方案,該解決方案不需要使用繼承。如果你有另一個想法,讓我在這裏。 – YAT

+1

只要'Contact * * hasMany * s沒有* belongsTo *回'Contact',您就可以使用Groovy特性。該特徵將包含'Contact'和'Employee'中的屬性和關聯,通過實現這個特徵可以得到它們。這意味着不會有聯繫實體/域類。其他領域類也可以實現這個特徵。 –

回答

1

我認爲你正在使用繼承。由於Employee由選擇子集Contact s的數據庫視圖支持,因此EmployeeContact。所以你有一個很好的繼承人選。

表的每次子類繼承

您所描述的employee視圖如下:

SELECT * FROM contact where employee=1 

當使用子類生成的表的表的每次子類繼承含有以下列:

  1. ID(主鍵)
  2. 添加到子類的屬性的列(是否t在超類中),不包括關聯的屬性。

由於Employee沒有,也無法添加附加屬性,因此視圖只應返回主鍵。

SELECT id FROM contact where employee=1 

我有一個article是比較表每個層次表每個子類繼承和證明它是什麼樣子在數據庫級別。

加入表

在你的領域類的例子,你描述的連接表創建EmployeeCostCenter之間的許多一對多關係。加入表應該有兩個,只有兩個,列:

  1. 外鍵(在域類)
  2. 其他領域類的外鍵。

所以你employee_cost_center表應具有的列employee_idcost_center_id。如果您必須明確指定連接表,請使用key而不是column

costCenter joinTable: 'employee_cost_center', key: 'employee_id' 
employees joinTable: 'employee_cost_center', key: 'cost_center_id' 

屬於關聯

你有Employee屬於CostCenter像這樣:

static belongsTo = [CostCenter ] 

也許這是一個錯字,但如果你沒有定義一個反向引用,則屬於關聯應該簡單地定義爲類,如下所示:

static belongsTo = CostCenter 

我從來沒有用過belongsTo這樣我就不知道它在數據庫中的樣子。但請注意,如果你有一個反向引用,這樣定義:

static belongsTo = [costCenter: CostCenter] 

然後,你employee視圖必須返回cost_center列。

+0

爲什麼我應該只選擇數據庫視圖中的'id'?我需要永遠做一個連接來從'contact'獲取信息,那些信息並不是我想要的,因此我已經提出了這樣的觀點,即我可以從'Contact'獲取信息,而不用創建where子句或其他內容選擇'員工' – YAT

+0

因爲每個子類繼承的表是gorm將如何創建員工表。你可以在我的文章中看到這一點。 Gorm將在每次查詢員工域類時加入聯繫人和員工。 –