java - 我应该在 JPA 实体 equals 方法中使用 getter 或字段吗?

标签 java hibernate jpa equals

为 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 或空),但是当注释放置在 getter 上时,会发生这种情况吗?领域?

Hibernate 和其他供应商之间的行为有何不同?

我用谷歌搜索,甚至打开了一本书,但我是一个 JPA 菜鸟,我找不到这个问题的明确答案(尽管我确实注意到专家倾向于在他们的博客中使用 getter,例如this post)。

最佳答案

.equals 是实体类内部定义的方法。为此,没有理由使用任何 getter,因为即使具有私有(private)访问修饰符的字段也可以直接从同一类的方法访问。

Also, does it matter if I use FetchType.LAZY (I imagine it would)?

是的,从技术上讲,这很重要,因为在为惰性字段调用equals期间,您必须打开entityManager的 session ,否则会发生众所周知的LazyInitializationException错误。但是,由于 spring boot 使用默认的 spring.jpa.open-in-view=true ,因此它会短路此错误,因为它会保持 session 打开状态,直到将响应处理给用户为止。

因此,如果您使用 Spring-Boot 并且您自己没有像 spring.jpa.open-in-view=false 这样的自定义,那么如果您是否使用 FetchType.Lazy 来评估 equals

关于java - 我应该在 JPA 实体 equals 方法中使用 getter 或字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74591522/

相关文章:

java - 无法在 Android 10 中从 Intent 打开文件

java - 如何在另一个方法上调用带有 ActionEvent 参数的方法

java - 使用 Oracle 表分区的 JPA 或 Hibernates?

java - Hibernate - 如何在关系中正确使用级联

java - Spring-boot:需要一个名为 'entityManagerFactory' 的 bean,但找不到

java - 我有一个关于显示器问题的非常菜鸟的询问

java - 如何使用 APACHE POI HSSF 突出显示 Excel 中的单元格

java - JPA LOJ(左外连接): Cannot join to attribute of basic type

java - Hibernate在Servlet环境中的使用

java - Hibernate JPA 删除分离的对象