为 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/