簡體   English   中英

如何在不降低將對象存儲到db的性能的情況下逐字段比較@Entity注釋的類?

[英]How to compare class annotated by @Entity field by field without degrading performance of storing object into db?

我有在Java中用@Entity注釋的DB類。

我想比較Hamcrest字段比較字段的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))
}

因此,我有問題。 除了自動生成的equalshashCode以外,還有什么方法可以使對象在測試過程中相等,並且在存儲到數據庫時不會降低性能。 據我所知,目前對象是由id字段而不是所有字段檢查的。

您可以使用samePropertyValuesAs方法:

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

這將逐個字段比較您的對象,並在它們彼此相等的情況下執行斷言。 如果需要忽略某些字段,請查看適用於自動化測試的Shazamcrest-可重復使用的Hamcrest匹配器


更新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

您可能想要對類似這樣的數據實體使用Lombok https://projectlombok.org/之類的東西。 像equals,hashCode,getter和setter一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM