如何在不降低将对象存储到db的性能的情况下逐字段比较@Entity注释的类?

时间:2019-02-18 15:06:06

标签: java hibernate equals

我有在@Entity中用Java注释的DB类。

我想比较我要按字段比较字段的2个实例,但是从Hamcrest收到对象不相等的错误。除非我在equals中自动生成hashCodeEclipse,否则它将持续存在。

实体的结构如下:

@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和setters。

示例代码如何使用以上实体:

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))
}

因此,我有一个问题。除了自动生成equalshashCode以外,还有什么方法可以使对象在测试期间相等,并且在存储到数据库时不会降低性能。据我所知,目前对象是由id字段而非所有字段检查的。

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:-1)

您可能希望对像这样的数据实体使用Lombok https://projectlombok.org/之类的东西。像equals,hashCode,getter和setter一样。