已经多次讨论过如何为实体重新定义 equals/hashCode。
我的问题是关于是否需要使用 equals 中的所有字段。考虑两种情况。
当我们将所有字段用于等于时:
@Entity
public class Book {
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NaturalId
@Column(name = "isbn", nullable = false, unique = true)
private String isbn;
@Column
private String name;
private Book() {
}
public Book(String isbn) {
this.isbn = isbn;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(id, book.id) &&
Objects.equals(isbn, book.isbn) &&
Objects.equals(name, book.name);
}
@Override
public int hashCode() {
return Objects.hash(isbn);
}
}
并测试:
public class BookTest1 {
@PersistenceContext
protected EntityManager em;
@Test
public void fromTransientToManageSameEntity() {
Book book1 = new Book("4567-5445-5434-3212");
Book book2 = new Book("4567-5445-5434-3212");
em.persist(book2);
flushAndClean();
assertThat(book1, is(not((equalTo(book2))))); // not equals
}
}
正如我们所看到的,当将实体从瞬态转换为管理状态时 - 相同的实体将不相等。
另一种情况是当我们只使用等于@NaturalId 时:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(isbn, book.isbn);
}
并测试:
public class BookTest2 {
@PersistenceContext
protected EntityManager em;
@Test
public void fromTransientToManageSameEntity() {
Book book1 = new Book("4567-5445-5434-3212");
Book book2 = new Book("4567-5445-5434-3212");
em.persist(book2);
flushAndClean();
assertThat(book1, equalTo(book2)); // equals
}
}
正如我们所看到的,现在两个实体将是平等的。
我的问题是同一实体在过渡到管理状态时是否应该平等。因此,在这种情况下如何正确地重新定义等号。
慕工程0101907
三国纷争
蛊毒传说
随时随地看视频慕课网APP
相关分类