Я использую спящий режим и имею двунаправленные отношения.Как правильно переопределить equals () для обоих классов.
Вот код (с использованием объектов guava): (PS: это плохой пример и выбор сущностей, но я заинтересован в изучении рекомендуемыхспособ это сделать)
Назначение :
@Entity
@Table(name = "DESTINATION")
public class Destination{
private Integer id;
private String name;
private Set<DestinationAlias> aliases = new HashSet<DestinationAlias>(0);
@Override
public boolean equals(Object obj) {
if(obj == this) return true;
if(obj instanceof Destination){
final Destination otherDestination = (Destination) obj;
return Objects.equal(getName().toUpperCase(), otherDestination.getName().toUpperCase())
&& Objects.equal(getAliases(), otherDestination.getAliases());
}
return false;
}
}
DestinationAlias :
@Entity
@Table(name = "DESTINATIONALIAS")
public final class DestinationAlias {
private Integer idDestinationAlias;
private String alias;
private Destination mainCity;
@Override
public boolean equals(Object obj) {
if(obj == this) return true;
if(obj instanceof DestinationAlias){
final DestinationAlias otherAlias = (DestinationAlias) obj;
return Objects.equal(getAlias().toUpperCase(), otherAlias.getAlias().toUpperCase())
&& Objects.equal(getMainCity(), otherAlias.getMainCity());
}
return false;
}
}
Это тестcase:
@Test
public void testEqualsto(){
Destination dest = new Destination("abc", 1.0f, 1.0f);
dest.getAliases().add(new DestinationAlias("abc alias", dest));
Destination dest1 = new Destination("abc", 1.0f, 1.0f);
dest1.getAliases().add(new DestinationAlias("abc alias", dest1));
assertEquals(dest, dest1);
}
Как и ожидалось, происходит переполнение стека, поскольку каждый метод equals () по очереди вызывает другой метод equals (), и происходит цикл.
Какой рекомендуемый способ переопределить метод equals () для двунаправленных лиц.