j2j*_*j2j 57 java entity jpa equals hashcode
我想检查实体是否在另一个实体的Collection成员(@OneToMany或@ManyToMany)中:
if (entity2.getEntities1().contains(entity1)) { }
Run Code Online (Sandbox Code Playgroud)
Boz*_*zho 118
不必要.有三种选择:
不要覆盖 - 因此您将使用实例.当您使用仅附加到会话的实体(因此保证是相同的实例)处理集合时,这很好.在许多情况下,这是(对我而言)首选方式,因为在覆盖时需要更少的代码和更少的考虑
覆盖hashCode()并equals()使用业务密钥.这可能是标识实体的属性的子集.例如,对于一个User好的业务密钥可能是username或者email.这被认为是很好的做法.
仅覆盖hashCode()和equals()使用ID字段.在某些情况下这很好,特别是如果您有一个手动分配的标识符(如UUID).如果您的实体永远不会进入集合,那也没关系.但对于进入集合的瞬态实体(没有标识符),它会导致问题,因此请谨慎使用此选项.正如海员所说 - 你应该避免它.一般来说,除非你真的知道自己在做什么(并且可能记录下来),否则
有关详细信息,请参阅此文章.另外请注意,equals()和hashCode()被捆绑,并应具有完全相同的字段来实现两者.
Vla*_*cea 15
是的你应该!
如果您不覆盖默认值Java.lang.Object equals和hashCode实现:
@Entity(name = "Book")
public class Book implements Identifiable<Long> {
@Id
@GeneratedValue
private Long id;
private String title;
//Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
该merge操作将返回一个不同的对象实例,并且平等合同将在本文中解释为破解.
最好的方法是使用业务键,如下所示:
@Entity
public class Book implements Identifiable<Long> {
@Id
@GeneratedValue
private Long id;
private String title;
@NaturalId
private String isbn;
@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 int hashCode() {
return Objects.hash(getIsbn());
}
//Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用标识符进行相等性,但请注意,hashCode实现应始终返回与我在上面提到的相同帖子中所述相同的值:
@Entity
public class Book implements Identifiable<Long> {
@Id
@GeneratedValue
private Long id;
private String title;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Book)) return false;
Book book = (Book) o;
return Objects.equals(getId(), book.getId());
}
@Override
public int hashCode() {
return 31;
}
//Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
我们倾向于让IDE生成hashCode()和equals()我们.但要小心.为JPA实体生成这些方法时.某些版本的equals()类标识检查
// ... inside equals() - wrong approach for Entities (cause of generate proxies)
if (o == null || this.getClass() != o.getClass()) {
return false;
}
// ...
Run Code Online (Sandbox Code Playgroud)
这会破坏您的集合与一些JPA库,因为这些库创建您的实体(子类)的代理,例如MyGreatEntity_$$_javassist_7在Hibernate中.
在实体中始终允许子类equals().
| 归档时间: |
|
| 查看次数: |
34418 次 |
| 最近记录: |