Lombok 是一个非常受欢迎和有用的图书馆。尽管如此,请注意Lombok @EqualsAndHashCode对实体的影响可能会带来严重问题。
实体应实施equals()和hashCode()。主要问题是Hibernate要求实体在其所有状态转换(瞬态,附加,分离 和删除)中等于自身。使用Lombok @EqualsAndHashCode不会尊重此要求。
避免下面这些方法:
1. 避免使用的Lombok默认行为@EqualsAndHashCode:
@Entity @EqualsAndHashCode public class LombokDefaultProduct implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
private String name; private String code;
|
2. 避免使用只有主键的Lombok@EqualsAndHashCode
@Entity @EqualsAndHashCode(exclude = {"name", "code"}) public class LombokIdProduct implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
private String name; private String code;
|
3. 避免使用默认equals()和hashCode(),下面实体没有编写自己的这两个方法,使用的是默认,不推荐这样做:
@Entity public class DefaultProduct implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
private String name; private String code;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getCode() { return code; }
public void setCode(String code) { this.code = code; }
}
|
4. 避免使用只依赖主键的equals()和hashCode():@Entity public class IdProduct implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
private String name; private String code;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getCode() { return code; }
public void setCode(String code) { this.code = code; }
@Override public int hashCode() { int hash = 3; hash = 89 * hash + Objects.hashCode(this.id); return hash; }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final IdProduct other = (IdProduct) obj; if (!Objects.equals(this.id, other.id)) { return false; } return true; } }
|
推荐这些方法:1. 依靠@NaturalId
@Entity public class NaturalIdProduct implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
private String name;
@NaturalId @Column(nullable = false, updatable = false, unique = true, length = 50) private String code;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getCode() { return code; }
public void setCode(String code) { this.code = code; }
@Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof NaturalIdProduct)) { return false; } NaturalIdProduct naturalIdProduct = (NaturalIdProduct) o; return Objects.equals(getCode(), naturalIdProduct.getCode()); }
@Override public int hashCode() { return Objects.hash(getCode()); }
}
|
2. 依靠主键:@Entity public class GoodProduct implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
private String name; private String code;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getCode() { return code; }
public void setCode(String code) { this.code = code; }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof GoodProduct)) { return false; } return id != null && id.equals(((GoodProduct) obj).id); }
@Override public int hashCode() { return 2018; }
}
|
良好的equals()和hashCode():
![](data:image/png;base64,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)
源代码可以在这里找到