java - Hibernate更新导致集合被删除并重新插入

标签 java mysql hibernate model-view-controller

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

我有一个与 @ManyToMany 关系中的 SectionPermission 表相关的 UserGroup 模型。 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似乎是一个 equals/hashcode 问题。这是我在应用程序的每个模型中实现的代码:

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())));
}

对我做错了什么有什么建议吗?

最佳答案

问题是您将 equals 和 hashcode 基于 ids,并且我假设 ids 是自动生成的。这种组合不适用于我所知道的任何 ORM。

我建议你阅读这篇文章wiki page这解释了 Hibernate 如何使用 equals 和 hashcode 以及要注意什么。

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

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

关于java - Hibernate更新导致集合被删除并重新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33694241/

相关文章:

java - 正则表达式格式的想法

java - 在 Java 中检测 Hashmap 中的循环依赖

c++ mysql 连接 bad_alloc 使用 c++ 连接器

java - Spring hibernate - 处理表中每行的异常

java - Kotlin:集合既没有泛型类型也没有 OneToMany.targetEntity()

java - java中反序列化步骤

mysql - Spring Dao says bad SQL grammar - 语法错误

mysql - 从 Mysql 的表中选择唯一的组合

mysql - Hibernate HQL 查询从与另一个表关联的表中获取数据

java - 如何忽略 "handler": {}, "hibernateLazyInitializer": {} in json jackson in Spring hibernate project?