在我的应用程序中,我有这些 Hibernate 映射类型(一般情况):
class RoleRule {
private Role role;
private PermissionAwareEntity entity; // hibernate-mapped entity for which permission is granted
private PermissionType permissionType; // enum
@ManyToOne
@JoinColumn(name = "ROLE_ID")
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
class Role {
private Set<RoleRule> rules = new HashSet<RoleRule>(0);
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="ROLE_ID")
public Set<RoleRule> getRules() {
return rules;
}
public void setRules(Set<RoleRule> rules) {
this.rules = rules;
}
}
所有类都有equals() & hashCode()
覆盖。
我的应用程序允许调整角色(仅限系统管理员,不用担心),在其他领域中,允许创建新的角色规则。创建新规则时,我尝试创建一个新RoleRule
对象并将其插入角色的字段中rules
。我调用session.update(role)
将更改应用到数据库。
现在是丑陋的部分...... Hibernate 决定在关闭事务和刷新时执行以下操作:
- 将新规则插入数据库。出色的。
- 更新其他角色字段(不是集合)。到目前为止,一切都很好。
- 更新现有规则,即使它们没有任何变化。我可以忍受这个。
- 再次更新现有规则。这是日志中的粘贴,包括自动评论:
/* 删除一对多行 Role.rules */ 更新 ROLE_RULE 设置 ROLE_ID=null where ROLE_ID=? 和 ROLE_RULE_ID=?
当然,所有字段都不是空的,这个操作非常失败。
任何人都可以尝试解释为什么 Hibernate 会这样做???更重要的是,我该如何解决这个问题???
编辑:我非常确定这与映射有关,然后我的老板一时兴起,删除了两个类中的equals()
and hashCode()
,使用 Eclipse 重新创建它们,神秘地解决了这个问题。
不过,我仍然对我的问题很好奇。谁能建议为什么 Hibernate 会这样做?