Несколько представлений одного и того же объекта при сохранении управляемых объектов гибернации (OneToMany) - PullRequest
0 голосов
/ 21 декабря 2018

У меня двунаправленные отношения OneToMany, которые управляются SpringData-Hibernate.

Вот одна сторона:

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

, а вот многие стороны:

@ManyToOne
private Konto konto;

Теперь в одном из моих интеграционных тестов при сохранении контента я получаю эту ошибку:

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...