java - 如何逐个字段比较@Entity注释的类而不降低将对象存储到数据库的性能?

标签 java hibernate equals

我有一个在 Java 中用 @Entity 注释的数据库类。

我想比较类的 2 个实例,我想按字段进行比较,但从 Hamcrest 收到错误,表明对象不相等。除非我在 Eclipse 中自动生成 equalshashCode,否则它会持续存在。

实体的结构如下:

@Entity
@Table(name = "book")
public class Book extends BaseEntity {

  @NotNull
  @Column
  private String title;
}

@MappedSuperClass
class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

}

为了简单起见,我省略了所有 getter 和 setter。

我如何使用上面的实体的示例代码:

public void updateBookTitles(bookIds) {
  List<Book> books = bookRepository.findByBookIds(bookIds);

  books.forEach((book) -> {
    book.setTitle("Example: " + book.getTitle());
  });
  bookRepository.saveAll(books);
}

测试时:

@Test
public void updateSingleBookTitle() {
    Book book = new Book();
    book.setId(1L);
    book.setTitle("Stack Overflow manual");

    when(bookRepository.findByBookIds(Arrays.asList(1L))).thenReturn(Arrays.asList(book));

    updateBookTitles(Arrays.asList(1L));

    Book expectedBook = new Book();
    expectedBook.setId(1L);
    expectedBook.setTitle("Stack Overflow manual");

    verify(bookRepository, times(1)).saveAll(Arrays.asList(expectedBook))
}

所以,我有这个问题。除了自动生成 equals 和 hashCode 之外,还有什么方法可以使对象在测试期间相等,并且在存储到数据库时不会降低性能。据我了解,目前对象是通过 id 字段而不是所有字段进行检查的。

最佳答案

您可以使用samePropertyValuesAs方法:

Book book1 = new Book();
Book book2 = new Book();
assertThat(book1, samePropertyValuesAs(book2));

这将逐个字段比较您的对象,并对它们之间的相等性执行断言。如果您需要忽略某些字段 - 请查看 Shazamcrest - Reusable Hamcrest matchers suitable for automated testing .

<小时/>

更新 1:

尝试使用下一个代码:

verify(bookRepository, times(1)).saveAll(argThat(new ArgumentMatcher<List<Book>>() {
            @Override
            public boolean matches(Object argument) {
                List<Book> bookToCheck = (List<Book>) argument;
                assertThat(bookToCheck.get(0), sameAsBean(expectedBook));
                return true;
            }
        }));

更多信息:ArgumentMatcher

关于java - 如何逐个字段比较@Entity注释的类而不降低将对象存储到数据库的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54750110/

相关文章:

java - 尝试使用构造函数传递数组值

java - 将对象列表中的双列表对象转换为字符串

java - 仅在第一次尝试时从 App Engine servlet 连接到 Google Cloud MySQL 时出错

hibernate - 如何确定 Hibernate PostUpdateEventListener 中的集合更改?

java - 如果我重载 equals 我仍然应该重写 java 中的 haschode 吗?

java - 如何从域对象创建 JSON View ?

java - 如何忽略 quarkus 测试

java - 由 : org. hibernate.PropertyNotFoundException 引起:无法在类上找到字段名称

java - 为什么这两个 Java 对象不相等?

c# - 每次调用 Equals 都会返回 false,即使值相同 (C#)