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

Java Hibernate更新会导致删除并重新插入集合,java,mysql,hibernate,model-view-controller,Java,Mysql,Hibernate,Model View Controller,我面临着这个“逻辑错误”: 我有一个与@manytomy关系中的SectionPermission表相关的UserGroup模型。UserGroup模型扩展了BaseModel@MappedSuperclass 用户组类@manytomy: @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST) @JoinTable(name = "user_section_permission", joinColumns = {

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

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

用户组类
@manytomy

@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;
}
@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\u section\u权限
表Hibernate将删除集合并重新插入每个记录

我发现这似乎是一个equals/hashcode问题。这是我在应用程序的每个模型中实现的代码:

基本模型类

@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基于id,我假设id是自动生成的。这种组合对我所知道的任何ORM都不起作用

我建议您阅读这篇文章,其中解释了Hibernate如何使用equals和hashcode以及需要注意的事项

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


大多数情况下,您不需要重写equals/hashcode。。。您使用的是
List
s,因此可能根本不需要它们。

ID怎么可能为空?当我显示模型时,ID为空,仅在保存时填充