在我的应用我有这方面的Hibernate映射类型(一般情况):当我尝试更新/插入时,为什么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的决定做关闭交易和冲洗时注意以下事项
- 将新规则到数据库中。优秀。
- 更新其他角色字段(不是集合)。到现在为止还挺好。
- 更新现有规则,即使其中没有任何更改。我可以忍受这一点。
- 再次更新现有规则。这里有一个膏会从日志,包括自动评论:
/* delete one-to-many row Role.rules */ update ROLE_RULE set ROLE_ID=null where ROLE_ID=? and ROLE_RULE_ID=?
当然,所有的字段不为空,而这个操作壮观失败。
任何人都可以尝试解释为什么Hibernate会这样做吗?更重要的是,我怎样才能解决这个问题?
编辑:我很肯定这是什么做的映射,然后我的老板,一时兴起,删除了这两个类的equals()
和hashCode()
,使用Eclipse重建他们,神不知鬼不觉这个问题解决了。
虽然我仍然很好奇我的问题。任何人都可以提出为什么Hibernate会这样做?
您使用哪种驱动程序和方言? – 2008-10-07 16:20:08
该应用程序在Oracle 10g上运行,但这并不重要。 – Yuval 2008-10-07 17:18:09
最重要的是,您的帖子中缺少`equals`和`hashCode`方法的实现。根据由hibernate或数据库生成的数据库标识值**构建“equals”和“hashCode”方法是一个坏主意,这使得它们依赖于任何可以在构建时间更糟后更新的字段。 – 2016-03-01 00:41:52