2008年9月5日金曜日

HibernateのBeanのhashCode()とequals()実装

最近DBをいじる際はHibernateで楽してます。
で、DBのテーブルとBeanをマッピングする際は、hashCode()とequals()を実装する必要があるわけです。そこで便利なのがJakarta CommonsのLangライブラリです。

最も楽にOverwriteする方法は、下なんですが、クラス内の全てのフィールドがDBの主キーとして扱われてしまうので、これはHibernateなどDB的には良くないです。

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

public int hashCode(){
return HashCodeBuilder.reflectionHashCode(this);
}

public boolean equals(Object o){
return EqualsBuilder.reflectionEquals(this,o);
}


ということで、下記のようにDBの複合主キーできちんと実装しましょう。

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

public int hashCode(){
return new HashCodeBuilder(17,37).append(PRIMARY_KEY1).append(PRIMARY_KEY2).toHashCode();
}

public boolean equals(Object o){
boolean equals = false;
if(o != null && YOUR_CLASS.class.isAssignableFrom(o.getClass())){
YOUR_CLASS pcc = (YOUR_CLASS)o;
equals = (new EqualsBuilder().append(PRIMARY_KEY1,pcc. PRIMARY_KEY1)
.append(PRIMARY_KEY2,pcc. PRIMARY_KEY2)).isEquals();
}
return equals;
}




なお、きちんとOverwriteしていないと下記のようなエラーが出ます。
WARN RootClass - composite-id class does not override equals(): com.xxx.yyy.entity.YOURCLASS


それにしてもHibernateは楽ですね。