В 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 уже является составным для пользователя и роли?
Я удалил интерфейс Serializable и сравнил методы hashcode с UserRole и протестировал его как на mysql, так и на mongodb.While с использованием mysql с hibernate он дал «org.hibernate.MappingException: класс составных идентификаторов должен реализовывать Serializable». Но отлично работал с mongodb.So Я думаю, что это требуется только тогда, когда datasourse является hibernate. Если я прав, то следует упомянуть в весенних плагинах с плагинами безопасности, поскольку этот плагин используется различными datasourses. –
Кстати, спасибо за предоставление этой информации. У меня нет знаний о спящем режиме, и я просто мало знаю о Сериализации. Остается вопрос в моем сознании. Почему спящий режим навязал это условие реализации интерфейса Serializable? –