Hbernateオブジェクトの3つの状態、saveOrUpdate()方法及びmerge()方法のまとめ

1641 ワード

瞬時状態(Transient)
オブジェクトはセッションに関連していません.データベースには対応するデータがありません.一般的にnewのオブジェクトは瞬時のオブジェクトです.瞬時オブジェクトに対してsave()方法を用いると、永続的なオブジェクトとなる.データベースには対応するデータがないので、瞬時オブジェクトに対してupdate()メソッドを使用するのは無効です.
持久状態(Persistent)
オブジェクトはセッションに関連しており、データベースには対応IDのデータがあります.get()load()などの方法を用いて得られたのは、永続的なオブジェクトである.瞬時オブジェクトに対してsave()方法を用いると、永続的なオブジェクトとなる.遊離対象に対してupdate()方法を用いると、永続的なオブジェクトとなる.永続的なオブジェクトに対して、瞬時のオブジェクトにするdelete()方法を使用する.
遊離状態(Detached)
オブジェクトはsessionsとは関連していませんが、データベースには対応するIDのデータがあります.瞬時オブジェクトにsetId()方法を使用し、データベースに対応するIDのデータがある場合、当該オブジェクトはフリーオブジェクトとなる.オブジェクトが永続的な状態である場合、sessionに対してclose()clear()evict()などの方法を実行すると、この永続的なオブジェクトはフリーオブジェクトとなる.遊離対象に対してdelete()方法を用いると、瞬時の対象となる.遊離対象に対してupdate()方法を用いると、永続的なオブジェクトとなる.データベースにはすでに対応するIDのデータが存在しているので、フリーオブジェクトに対してsave()方法を使用するのは無効です.
saveOrUpdate()
また、ヒベルナタはsaveOrUpdate()方法を提供しており、ヒベルナはオブジェクトの状態に応じて、正しい方法を選択して動作する.具体的には、オブジェクトが瞬時状態である場合には、save()の動作が実行される.オブジェクトがフリー状態である場合には、update()動作が実行される.ある場面では、オブジェクトの具体的な状態が分からない場合には、この方法が考えられます.
merge()
sessionには、持久的なオブジェクトと関連するオブジェクトが既に存在している場合(例えば、get()load()などの方法を実行した後)、同じidを持つ遊離オブジェクトに対してupdate()操作を行うと、sessionには同じidのオブジェクトが2つあり、これはHibernateでは許可されないので、例外を投げます.merge()方法の代わりにupdate()方法を使用すると、ヒベルナはオブジェクトから分離されたデータをsessionのオブジェクトにコピーし、遊離オブジェクトは永続的なオブジェクトに変換されないので、sessionの中にはオブジェクトが一つしかなく、データはすでに更新されており、遊離対象はまだフリーオブジェクトである.