复合 id 类的 hashCode() 和 equals() 方法

Sag*_*est 5 java many-to-many hibernate equals hashcode

几天来我一直在努力寻找实现复合 ID 类的 equals() 和 hashCode() 方法的正确方法。

当我尝试更新主要对象 (Gara) 时,我面临的问题是:

  1. 堆栈溢出
  2. DuplicateKeyException:具有相同标识符值的不同对象已经与会话相关联
  3. org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行

我的复合 ID 类

@Embeddable 
public class GaraAgenziaId implements Serializable {

    private static final long serialVersionUID = 4934033367128755763L;

    static Logger logger = LoggerFactory.getLogger(GaraAgenziaId.class);

    private Gara gara;

    private Agenzia agenzia;

    @ManyToOne
    public Gara getGara() {
        return gara;
    }

    public void setGara(Gara gara) {
        this.gara = gara;
    }

    @ManyToOne
    public Agenzia getAgenzia() {
        return agenzia;
    }

    public void setAgenzia(Agenzia agenzia) {
        this.agenzia = agenzia;
    }


    @Override
    public String toString() {
        return "GaraAgenziaId [Gara=" + gara + ", agenzia=" + agenzia
                + "]";
    }


}
Run Code Online (Sandbox Code Playgroud)

Sag*_*est 5

这些似乎工作得很好:

 public boolean equals(Object o) {
        if (this== o) return true;
        if (o ==null|| getClass() != o.getClass()) return false;

        GaraAgenziaId that = (GaraAgenziaId) o;

        if (gara !=null?!gara.equals(that.gara) : that.gara !=null) return false;
        if (agenzia !=null?!agenzia.equals(that.agenzia) : that.agenzia !=null)
            return false;

        return true;
    }

    public int hashCode() {
        int result;
        result = (agenzia !=null? agenzia.hashCode() : 0);
        result =31* result + (gara !=null? gara.hashCode() : 0);
        return result;
    }   
Run Code Online (Sandbox Code Playgroud)