Tôi có một lớp học BaseEntity
là một siêu lớp của tất cả các thực thể JPA trong ứng dụng của tôi.Làm thế nào để thực hiện phương thức equals() và hashcode() trong BaseEntity của JPA?
@MappedSuperclass
public abstract class BaseEntity implements Serializable {
private static final long serialVersionUID = -3307436748176180347L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable=false, updatable=false)
protected long id;
@Version
@Column(name="VERSION", nullable=false, updatable=false, unique=false)
protected long version;
}
Mỗi JPA thực thể kéo dài từ BaseEntity
và kế thừa id
và version
thuộc tính của BaseEntity
.
Cách tốt nhất để thực hiện phương thức equals()
và hashCode()
ở số BaseEntity
là gì? Mỗi lớp con của BaseEntity
sẽ kế thừa equals()
và hashCode()
biểu mẫu hành vi BaseEntity
.
tôi muốn làm một cái gì đó như thế này:
public boolean equals(Object other){
if (other instanceof this.getClass()){ //this.getClass() gives class object but instanceof operator expect ClassType; so it does not work
return this.id == ((BaseEntity)other).id;
} else {
return false;
}
}
Nhưng instanceof
điều hành cần đối tượng classtype và không lớp; đó là:
if(other instanceof BaseEntity)
này sẽ làm việc như BaseEntity là classType đây
if(other instanceof this.getClass)
này sẽ không làm việc vì
this.getClass()
lợi nhuận lớp đối tượng củathis
đối tượng
Cũng giống như một ghi chú, spec JPA không yêu cầu các đơn vị cung cấp xử lý đặc biệt cho hashCode/bằng và sử dụng DataNucleus như một thực hiện JPA không đòi hỏi bất cứ điều gì về hình thức đó. Rõ ràng một số người khác (ví dụ như Hibernate?) Có thể áp đặt rằng bạn – DataNucleus
@DataNucleus Bạn có thể vui lòng hiển thị tham chiếu chỉ ra rằng Hibernate không áp đặt bất kỳ điều gì về bạn về 'equals()/hashCode()' (gợi ý: Hibernate chính nó không ** không ** gọi 'equals()' và 'hashCode()' trên đối tượng thực thể). –