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

时间:2015-11-13 13:49:34

标签: java mysql hibernate model-view-controller

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

我有一个UserGroup模型与SectionPermission关系中的@ManyToMany表格相关联。 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并且似​​乎是一个等于/ 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())));
}

有什么建议我做错了吗?

1 个答案:

答案 0 :(得分:0)

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

我建议你阅读这个wiki page来解释H Hibernate使用equals和hashcode以及需要注意的事项。

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

大多数情况下,您不需要覆盖equals / hashcode ...并且您正在使用List,因此您可能根本不需要它们。