[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 メーリングリストの案内