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

5

我已经试了好几天,试图找到实现复合ID类的equals()和hashCode()方法的正确方式。

当我尝试更新主对象(Gara)时遇到的问题是:

  1. StackOverflow
  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
                + "]";
    }


}
1个回答

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;
    }   

31*a + b 会不会有溢出的风险? - Mindwin Remember Monica
@Mindwin 抱歉,我不够专业,无法回答你。这是在某个地方找到的一段代码,对我的目的起作用。 - SaganTheBest
它会溢出,但不会报错,因此作为哈希码仍然有效。 - Ian Robertson
@IanRobertson 首先,非常感谢您的评论。但是我只是凭运气看到了您的回复(我正在查看我的星标列表)。记得使用 @ 引用!!XD - Mindwin Remember Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接