2014-02-19 146 views
1

在Grails中,Spring安全核心插件有助於創建用戶和角色域。由於它們之間有多對多的關係,第三個域UserRole被創建。爲什麼UserRole實現Serializable並覆蓋equals()和hashcode()方法

UserRole.groovy 

import org.apache.commons.lang.builder.HashCodeBuilder 

class UserRole implements Serializable { 

    private static final long serialVersionUID = 1 

    User user 
    Role role 

    boolean equals(other) { 
     if (!(other instanceof UserRole)) { 
      return false 
     } 

     other.user?.id == user?.id && 
      other.role?.id == role?.id 
    } 

    int hashCode() { 
     def builder = new HashCodeBuilder() 
     if (user) builder.append(user.id) 
     if (role) builder.append(role.id) 
     builder.toHashCode() 
    } 

    static UserRole get(long userId, long roleId) { 
     UserRole.where { 
      user == User.load(userId) && 
      role == Role.load(roleId) 
     }.get() 
    } 

    static UserRole create(User user, Role role, boolean flush = false) { 
     new UserRole(user: user, role: role).save(flush: flush, insert: true) 
    } 

    static boolean remove(User u, Role r, boolean flush = false) { 

     int rowCount = UserRole.where { 
      user == User.load(u.id) && 
      role == Role.load(r.id) 
     }.deleteAll() 

     rowCount > 0 
    } 

    static void removeAll(User u) { 
     UserRole.where { 
      user == User.load(u.id) 
     }.deleteAll() 
    } 

    static void removeAll(Role r) { 
     UserRole.where { 
      role == Role.load(r.id) 
     }.deleteAll() 
    } 

    static mapping = { 
     id composite: ['role', 'user'] 
     version false 
    } 
} 

我從來沒有見過或創建實現Serializable interface.I域類Grails的思考處理序列化過程internally.So爲什麼UserRole的實現Serializable?在這裏重寫equals()和hascode()方法有什麼好處,因爲UserRole的id已經在用戶和角色上合成了?

回答

1

這是使用複合鍵時Hibernate的一個要求;看到

+0

我刪除了Serializable接口,並且等於來自UserRole的hashcode方法,並在mysql和mongodb上進行了測試。當使用mysql和hibernate時,它給出了「org.hibernate.MappingException:composite-id類必須實現Serializable」。 mongodb.So我認爲它只需要當datasourse是hibernate.If我是正確的,它應該在春季安全核心插件文檔中提到,因爲這個插件被各種數據庫使用。 –

+0

順便說一句,感謝您提供這些信息。我沒有任何有關休眠的知識,而且我對串行化知之甚少。仍然存在一個問題。爲什麼hibernate強加這個實現Serializable接口的條件? –

相關問題