保存休眠管理的实体时,同一实体的多个表示形式(OneToMany)

时间:2018-12-21 13:07:40

标签: hibernate spring-data

我有一个由SpringData-Hibernate管理的双向OneToMany关系。

这是一面:

@OneToMany(mappedBy = "konto", fetch = FetchType.EAGER, cascade = { CascadeType.MERGE })
protected Set<Karte> karten = new HashSet<>();

这是很多方面:

@ManyToOne
private Konto konto;

现在在我的一项集成测试中,保存konten时出现此错误:

Multiple representations of the same entity [Karte#1] are being merged. Detached:[Karte{id=1, ... ]

我知道已经讨论了很多次了,但是没有建议的解决方案对我有用。

我知道,当equals和hashcode方法未正确实现时,会发生这种情况。这是Karte的方法:

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        if (this.nummer != null) {
            result = prime * result + this.nummer.hashCode();
        } else {
            result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
        }
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (this.getClass() != obj.getClass()) {
            return false;
        }
        Karte other = (Karte) obj;
        if (this.getNummer() != null && other.getNummer() != null) {
            if (!this.getNummer().equals(other.getNummer())) {
                return false;
            }
        } else if (this.getId() == null) {
            return false;
        } else if (!this.getId().equals(other.getId())) {
            return false;
        }
        return true;
    }

这是Konto的方法:

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((this.kontofuehrend == null) ? 0 : this.kontofuehrend.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (this.getClass() != obj.getClass()) {
            return false;
        }
        Konto other = (Konto) obj;
        if (this.kontofuehrend == null) {
            if (other.kontofuehrend != null) {
                return false;
            }
        } else if (!this.kontofuehrend.equals(other.kontofuehrend)) {
            return false;
        } 
        return true;
    }

0 个答案:

没有答案