我应该在JPA实体equals方法中使用getter还是字段?

sbtkgmzw  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(174)

在为JPA实体编写equals方法时,我应该直接访问字段,还是应该通过getter访问?
换句话说,我该这么做吗?

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Book)) return false;
    Book book = (Book) o;
    return Objects.equals(getIsbn(), book.getIsbn());
}

还是这个?

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Book)) return false;
    Book book = (Book) o;
    return Objects.equals(isbn, book.isbn);
}

在这个上下文中,我是将JPA注解放在字段上还是放在getter上有关系吗?另外,我使用FetchType.LAZY有关系吗(我想它会有关系)?我在某个地方读到,如果按字段访问,并且注解放在getter上(它们将保持null或空),那么惰性字段不会被具体化,但是当注解放在字段上时,这种情况会发生吗?
Hibernate和其他供应商的行为是否不同?
我在谷歌上搜索,甚至打开了一本书,但我是一个JPA新手,我找不到这个问题的确切答案(尽管我注意到Maven们倾向于在他们的博客中使用getter,比如this post)。

jchrr9hc

jchrr9hc1#

.equals是在实体类内部定义的方法。因此,没有理由使用任何getters,因为即使是带有私有访问修饰符的字段也可以从同一个类的方法直接访问。
另外,如果我使用FetchType.LAZY(我想它会),这有关系吗?
是的,从技术上讲,这很重要,因为您必须在为惰性字段调用equals期间打开entityManager的会话,否则会发生众所周知的LazyInitializationException错误。但由于spring Boot 使用默认值spring.jpa.open-in-view=true,它会短路此错误,因为它会保持会话打开,直到响应被处理给用户。
因此,如果您使用Spring-Boot,并且您自己没有像spring.jpa.open-in-view=false这样的任何自定义,那么您是否使用FetchType.Lazy来计算equals并不重要。

相关问题