gpt4 book ai didi

hibernate - 为什么当我尝试更新/插入时 Hibernate 会尝试删除?

转载 作者:行者123 更新时间:2023-12-02 18:54:39 24 4
gpt4 key购买 nike

在我的应用程序中,我有这些 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 决定在关闭事务和刷新时执行以下操作:

  1. 将新规则插入数据库。非常好。
  2. 更新其他角色字段(不是集合)。到目前为止一切顺利。
  3. 更新现有规则,即使其中没​​有任何变化。我可以忍受这个。
  4. 再次更新现有规则。以下是日志中的粘贴内容,包括自动注释:
/* 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 会这样做?

最佳答案

我通常使用两种方法在 Hibernate 中更新集合(一对多的多方)。强力方法是清除集合,在父集合上调用 save,然后调用lush。然后将所有集合成员添加回来,并再次在父级上调用 save。这将删除所有内容,然后插入所有内容。中间的刷新是关键,因为它强制删除在插入之前发生。最好只在小型集合上使用此方法,因为它会重新插入所有集合。

第二种方法更难编码,但效率更高。您循环遍历新的子级集,并手动修改仍然存在的子级,删除不存在的子级,然后添加新的。在伪代码中,这将是:

copy the list of existing records to a list_to_delete
for each record from the form
remove it from the list_to_delete
if the record exists (based on equals()? key?)
change each field that the user can enter
else if the record doesn't exist
add it to the collection
end for
for each list_to_delete
remove it
end for
save

我在 Hibernate 论坛上搜索了好几个小时,试图找到解决这个问题的正确方法。您应该能够更新集合以使其准确,然后保存父集合,但正如您所发现的,Hibernate 会在删除子集合之前尝试将子集合与父集合分离,如果外键不为空,则它会尝试将子集合与父集合分离。将会失败。

关于hibernate - 为什么当我尝试更新/插入时 Hibernate 会尝试删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/179259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com