У меня двунаправленные отношения 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;
}