2014-02-19 3 views
1

В Grails плагин основного ядра Spring помогает создавать пользовательские и ролевые домены. Отныне для многих-многих отношений в них создается 3-й домен 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 
    } 
} 

Я никогда не видел и не создал класс домена, который реализует сериализуемые interface.I думает Grails обрабатывает процесс сериализации internally.So почему UserRole реализует Serializable? И в чем преимущество переопределения методов equals() и hascode() здесь, поскольку идентификатор UserRole уже является составным для пользователя и роли?

ответ

1

Это требование Hibernate при использовании составных клавиш; см. http://docs.jboss.org/hibernate/orm/3.5/reference/en-US/html/mapping.html#mapping-declaration-compositeid

+0

Я удалил интерфейс Serializable и сравнил методы hashcode с UserRole и протестировал его как на mysql, так и на mongodb.While с использованием mysql с hibernate он дал «org.hibernate.MappingException: класс составных идентификаторов должен реализовывать Serializable». Но отлично работал с mongodb.So Я думаю, что это требуется только тогда, когда datasourse является hibernate. Если я прав, то следует упомянуть в весенних плагинах с плагинами безопасности, поскольку этот плагин используется различными datasourses. –

+0

Кстати, спасибо за предоставление этой информации. У меня нет знаний о спящем режиме, и я просто мало знаю о Сериализации. Остается вопрос в моем сознании. Почему спящий режим навязал это условие реализации интерфейса Serializable? –

Смежные вопросы