분명 HashSet에 이미 존재하는 객체인데, contains가 false로 나타나고, 계속해서 중복된 객체가 Set에 저장되는 이슈를 맞이했습니다.
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Product extends EntityDate {
@OneToMany(
mappedBy = "product",
cascade = CascadeType.PERSIST,
orphanRemoval = true
)
private final Set<ProductItem> items = new HashSet<>();
import java.util.HashSet;
public class Mystery2 {
public static void main(String args[]) {
class Dog {
String color;
public Dog(String s) {
color = s;
}
}
HashSet<Dog> dogSet = new HashSet<Dog>();
dogSet.add(new Dog("white"));
dogSet.add(new Dog("white"));
System.out.println("We have " + dogSet.size() + " white dogs!");
if (dogSet.contains(new Dog("white"))) {
System.out.println("We have a white dog!");
} else {
System.out.println("No white dog!");
}
}
}
윗 코드에 대한 예상
이미 Set안에 white dog가 있으니
첫 white dog만 저장되고,
두번째 white dog는 누락돼서=> We have a 1 white dogs => We have a white dog!
이렇게 두 줄이 출력할 것이다.
!! 그러나 예상은 모조리 빗겨갔습니다.
결과
@Override
public int hashCode() {
return Objects.hash(product.getId().toString() + item.getId().toString());
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ProductItem)) {
return false;
}
ProductItem productItem = (ProductItem) o;
return Objects.equals(this.hashCode(), productItem.hashCode());
}
JAVA의 동등성, 동일성 , equals, hashCode
https://mangkyu.tistory.com/101
https://leoheo.github.io/java-hashcode-equlas/
https://stackoverflow.com/questions/47908818/hashset-item-equals-but-hashset-doesnt-contains