2010-06-30 32 views
6

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 idversion thuộc tính của BaseEntity.

Cách tốt nhất để thực hiện phương thức equals()hashCode() ở số BaseEntity là gì? Mỗi lớp con của BaseEntity sẽ kế thừa equals()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ủa this đối tượng

+1

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

+0

@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ể). –

Trả lời

2

Bạn có thể làm

if (this.getClass().isInstance(other)) { 
    // code 
} 
+0

Có Nó hoạt động như đã hết hạn. –

+0

http://stackoverflow.com/questions/1928191/what-is-the-correct-way-of-overriding-hashcode-and-equals-methods-of-persis –

Các vấn đề liên quan