【问题标题】:Hibernate update causes collection to be deleted and re-inserted休眠更新导致集合被删除并重新插入
【发布时间】:2016-02-15 02:57:17
【问题描述】:

我正面临这个“逻辑错误”:

我有一个 UserGroup 模型与 @ManyToMany 关系中的 SectionPermission 表相关。 UserGroup 模型扩展了 BaseModel @MappedSuperclass

UserGroup 类@ManyToMany:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinTable(name = "user_section_permission", joinColumns = {
    @JoinColumn(name = "id_user_group", nullable = false, updatable = false)},
        inverseJoinColumns = {
            @JoinColumn(name = "id_section_permission",
                    nullable = false, updatable = false)})
public List<SectionPermission> getSectionPermissions() {
    return sectionPermissions;
}

SectionPermissionClass @ManyToMany:

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JoinTable(name = "user_section_permission", joinColumns = {
    @JoinColumn(name = "id_section_permission", nullable = false, updatable = false)},
        inverseJoinColumns = {
            @JoinColumn(name = "id_user_group",
                    nullable = false, updatable = false)})
public List<UserGroup> getUserGroups() {
    return userGroups;
}

当我对此模型执行更新时,更新user_section_permission 表时,Hibernate 会删除集合并重新插入每条记录!

我发现了这个question,似乎是一个等于/哈希码问题。这是我在应用程序的每个模型中实现的代码:

BaseModel 类

@Override
public int hashCode() {
    int hash = 0;
    hash += (getId() != null ? getId().hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    if (!(object instanceof BaseModel)) {
        return false;
    }

    BaseModel other = (BaseModel) object;
    return !((getId() == null && other.getId() != null) || (getId() != null && !getId().equals(other.getId())));
}

任何其他类别

@Override
public int hashCode() {
    int hash = 0;
    hash += (getId() != null ? getId().hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    if(!(object instanceof UserGroup)) {
        return false;
    }

    Model other = (Model) object;
    return !((getId() == null && other.getId() != null) || (getId() != null && !getId().equals(other.getId())));
}

任何关于我做错了什么的建议?

【问题讨论】:

  • ID怎么可能为空?
  • 当我创建一个模型时,ID 为空,只有在保存时才会填充

标签: java mysql hibernate model-view-controller


【解决方案1】:

问题是您将等号和哈希码基于 id,我假设 id 是自动生成的。这种组合不适用于我知道的任何 ORM。

我建议您阅读此wiki page,它解释了 Hibernate 使用 equals 和哈希码以及需要注意的事项。

其中一个解决方案是让您提供 ID(可能使用 UUID)或将 equals/hashcode 编写为基于业务平等而不是数据库平等。

大多数时候,您不需要覆盖 equals/hashcode... 而您使用的是 Lists,因此您可能根本不需要它们。

【讨论】:

    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多