[jpa:93] Re: Kuina-Dao利用時にエンティティのequals()のオーバーライドは必要でしょうか?
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2008年 1月 11日 (金) 02:00:02 JST
小林 (koichik) です.
Date: Thu, 10 Jan 2008 23:50:22 +0900
From: "Nobuaki Ito" <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [jpa:90] Kuina-Dao利用時にエンティティのequals()のオーバーライドは必要でしょうか?
> Kuina-Dao利用時に、エンティティクラスのequals()メソッドのオーバーライドは必要でしょうか?
必要ではありません.
> 永続性という観点から、equals()はidフィールド(主キー)の一致の判定という形にすべきと、"EJB3.0プログラミング"(青い本)に記載があったのですが、Kuina-Daoのサンプルの方では特に触れられていないようです。
JPA の仕様では,エンティティクラス自体の equals に
ついては何も規定されていません.
オーバーライドしろとも,してはならないとも
書いてないのです.
@EmbeddedId や @IdClass で使われる複合主キーを
表すクラスについては,equals() をオーバーライドして
(同一性ではなく) 同値性で判定するように規定されて
いますが.
基本的に,equals() をオーバーライドするのは
等価性の判定に同一性ではなく同値性を使う場合ですが,
同値性を使うなら同時に不変であるべきです.
# 少なくとも概念的には.
# コレクションとか当てはまらないのも多いけど.
しかし,基本的にエンティティは不変ではありません.
であるなら,equals() はオーバーライドすべきでは
ないということになります.
一方,主キーについてはアプリケーションが値を
変更してはならないと規定されています.
つまり,複合主キーを表すクラスは概念的には
不変であり,equals() をオーバーライドして
同値性で判定するのは妥当と思われます.
結局は,プロジェクトとして「エンティティの等価性」を
どう扱いたいのかによるのではないかと.
RDB の同一のレコードにマッピングされているなら,
もしバージョンが異なっていても「等しい」と判定
したいのであれば,青い本のようにしても
いいのかもしれません.
Hibernate のドキュメントではまた別の方法が
推奨されてるので参考にどうぞ.
http://www.hibernate.org/hib_docs/v3/reference/en/html/persistent-classes.html#persistent-classes-equalshashcode
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>
jpa メーリングリストの案内