hashCode() และเท่ากับ() วิธีการของคลาสรหัสคอมโพสิต

หลายวันมาแล้วที่ฉันพยายามค้นหาวิธีที่ถูกต้องในการใช้เมธอดเท่ากับ () และ hashCode() ของคลาสคอมโพสิต ID

ปัญหาที่ฉันกำลังเผชิญเมื่อพยายามอัปเดตวัตถุหลัก (Gara) คือ:

  1. สแต็คโอเวอร์โฟลว์
  2. DuplicateKeyException: วัตถุอื่นที่มีค่าตัวระบุเดียวกันเชื่อมโยงกับเซสชันแล้ว
  3. org.hibernate.ObjectNotFoundException: ไม่มีแถวที่มีตัวระบุที่กำหนดอยู่

คลาส Composite-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
                + "]";
    }


}

person SaganTheBest    schedule 15.07.2014    source แหล่งที่มา


คำตอบ (1)


ดูเหมือนว่าสิ่งเหล่านี้จะทำงานได้ดีมาก:

 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;
    }   
person SaganTheBest    schedule 16.07.2014
comment
ไม่ 31*a + b เสี่ยงล้นเหรอ? - person Mindwin; 08.11.2016
comment
@Mindwin ขออภัย แต่ฉันไม่มีผู้เชี่ยวชาญเพียงพอดังนั้นฉันจึงไม่สามารถตอบคุณได้ มันเป็นโค้ดชิ้นหนึ่งที่พบที่ไหนสักแห่งและใช้งานได้ตามจุดประสงค์ของฉัน - person SaganTheBest; 06.03.2017
comment
มันจะล้น แต่ไม่มีข้อผิดพลาด ดังนั้นมันจะยังคงมีผลเป็นแฮชโค้ด - person Ian Robertson; 29.01.2018
comment
@IanRobertson ก่อนอื่นขอบคุณมากสำหรับความคิดเห็นของคุณ แต่ฉันสามารถดูคำตอบของคุณได้เพียงเพราะโชคช่วยเท่านั้น (ฉันกำลังตรวจสอบรายการที่ติดดาว) อย่าลืม@คำคม!! XD - person Mindwin; 27.03.2018