2017-07-05 3 views
2

Hibernateはデタッチされたオブジェクトと一時オブジェクトを区別します。 私は、データベースに相談することなく、意味します。たとえば、IDを手動で設定する一時オブジェクトを永続化しようとすると、Hibernateは自分のオブジェクトが一時的であることをどのように認識しますか?またはidは空ではないので、私のオブジェクトは切り離されたオブジェクトと見なされますか?Hibernateはデタッチされたオブジェクトと一時的なオブジェクトをどのように区別し、どこで手作業でIDを設定しますか

答えて

2

過渡 - それはちょうどnew演算子を使用して をインスタンス化されており、それはHibernateの セッションに関連付けられていない場合、オブジェクトが一時的です。データベースには永続的な表現はなく、識別子値は に割り当てられていません。

デタッチされた - デタッチされたインスタンスは、永続化されたオブジェクトで、 ですが、そのセッションは閉じられています。もちろん、オブジェクトへの参照はまだ有効ですが、 が有効です。この状態では、デタッチされたインスタンスが に変更されることさえあります。

Hibernate APIはgetIdentifierメソッドでClassMetadataクラスを持ちます。これにより、エンティティのステージを確認できます。

SessionFactory sb f = HibernateUtil.getSessionFactory(); 
ClassMetadata metadata = sf.getClassMetadata(data.getClass()); 

if(metadata.getIdentifier(data) == null) { 
    return TRANSIENT; 
} 
関連する問題