2015-08-26 43 views
2

問題是Galera集羣要求所有表都有一個ID PK。 Grails映射表沒有ID,沒有PK,甚至沒有第一範式。它似乎甚至不會停止重複的條目。grails hasMany映射表 - 如何讓他們使用一個ID(即將它們放在第一個標準格式)

例如爲:

Class Role { 
    String description 
    static hasMany [permissions :Permission] 
} 

Class Permission { 
    String name 
} 

這將創建一個表role_permission有以下的列:

  • role_permissions_id
  • permission_id

沒有ID!

我們嘗試使用liquibase在桌面上放置一個ID,但每次我們使用更新生成版本進行DB差異時,它都會再次關閉 - 我們需要更長久的修復。

我認爲我們可以創造我們自己的映射表:

class role_permission_custom { 
    Permission permission 
    Role role 
} 

但我們怎樣才能Grails的2.5使用呢?

我們不需要任何自動刪除級聯的東西,但我們希望現有的用戶界面工作...

我們嘗試了以下內容:

Class Role { 
    String description 
    static hasMany [permissions :Permission] 
    static mapping = { 
    permissions joinTable: [name: "role_permission_map", key: "role_id"] 
    } 
} 

class RolePermissionMap { 
    Permission permission 
    Role role 
} 

但是,這並不在所有的工作。首先,它不保存映射,當我們創建它們(並且不給任何類型的錯誤):

  portalPermission = new Permission(...) 
      new Role(description: "user", 
        permissions: [portalPermission, playerViewPermission, transactionsPlayerView]).save(failOnError: true) 

其次,該項目現在給:「HeuristicCompletionException:啓發式完成:結果狀態混合」和慣於開始,我們還沒有弄清楚。

我也試過這樣:

class RolePermissionMap { 
    Permission permission 
    Role rolePermissions 
    static mapping = { 
     version false 
    } 
} 

有趣的是,一段時間後,在引導,我得到這個:

Field 'role_permissions_id' doesn't have a default value 

回答

0

這與join_table辦法都不行將與其他工作設置(: 但是您必須創建一個實現Serializable的類。

沒有正確ID的聯結表是我們不幸應該處理的遺留問題,但在this post中有一個很好的解決方案。

我們用它在我們的應用程序,我們可以做這樣的事情Foo.create(Bar.get(it)).removeAll,甚至objBar.getFoos()

+1

嗨,它似乎工作,並沒有我的域類是Serializable。 –

2

OK,我已經找到了充分有效的解決方案,它原來是很容易與工作春季安全和我們的定製認證!

Class Role { 
    String description 
    static hasMany [permissions :Permission] 
    static mapping = { 
     permissions joinTable: [name: "role_permission_map", key: "role_permissions_id"] 
    } 
} 

class RolePermissionMap { 
    Permission permission 
    Role rolePermissions 

    static mapping = { 
     version false 
     rolePermissions unique: 'permission' 
    } 
} 

現在,我們只需要改變我們的方式是在引導這種分配角色的權限:

portalPermission = new Permission(...).save(failOnError: true) 
Role role = new Role(description: "user").save(failOnError: true) 
role.addToPermissions(portalPermission).save(failOnError: true) 

和應用程序無需修改,以對加萊拉映射表正確的ID列並沒有重複。

相關問題