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已經在用戶和角色上合成了?
我刪除了Serializable接口,並且等於來自UserRole的hashcode方法,並在mysql和mongodb上進行了測試。當使用mysql和hibernate時,它給出了「org.hibernate.MappingException:composite-id類必須實現Serializable」。 mongodb.So我認爲它只需要當datasourse是hibernate.If我是正確的,它應該在春季安全核心插件文檔中提到,因爲這個插件被各種數據庫使用。 –
順便說一句,感謝您提供這些信息。我沒有任何有關休眠的知識,而且我對串行化知之甚少。仍然存在一個問題。爲什麼hibernate強加這個實現Serializable接口的條件? –