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

Java 复合id类的hashCode()和equals()方法,java,hibernate,many-to-many,equals,hashcode,Java,Hibernate,Many To Many,Equals,Hashcode,几天来,我一直在试图找到实现复合id类的equals()和hashCode()方法的正确方法 我尝试更新主对象(Gara)时面临的问题是: 堆栈溢出 DuplicateKeyException:具有相同标识符值的不同对象已与会话关联 org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行 我的复合id类 @Embeddable public class GaraAgenziaId implements Serializable { pri

几天来,我一直在试图找到实现复合id类的equals()和hashCode()方法的正确方法

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

  • 堆栈溢出
  • DuplicateKeyException:具有相同标识符值的不同对象已与会话关联
  • 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
                    + "]";
        }
    
    
    }
    

    这些措施似乎效果很好:

     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抱歉,我不是专家,所以无法回答你。这是在某处找到的一段代码,它是为我的目的工作的。它将溢出,但不会出错,因此它作为哈希代码仍然有效。@IanRobertson首先,非常感谢您的评论。但我能看到你的回复纯属运气(我正在查看我的星号列表)。记住@quote!!除息的