州のリスト

そして楽しいことが始まります。Entity オブジェクトの状態を調べます。すべての料金と、Hibernate の使用料金も支払う必要があります。HQLを学ぶのはとても高いと思いませんか? いいえ、人生はもう少し複雑です。

Hibernate を使用してデータベースに保存できる何らかの Entity オブジェクトがある場合、Hibernate の観点から、このオブジェクトは 4 つの状態を持つことができます。

  • 過渡現象
  • 永続的(または管理対象)
  • 独立した
  • 削除されました

興味を持っていただけるよう、この講義に次の写真を追加します。

過渡現象

実際、ニュアンスがないわけではありませんが、すべてが見かけよりもはるかに単純です。たとえば、Java コードを使用して明示的に作成し、Hibernate を使用してデータベースからロードしなかったすべての Entity オブジェクトは、一時的 (透過的) ステータスを持ちます。

EmployeeEntity employee = new EmployeeEntity();

Transient ステータスは、Hibernate がこのオブジェクトについて何も認識しておらず、オブジェクトに対するアクションが Hibernate に影響を与えず、このオブジェクトに対する Hibernate の作業も影響しないことを意味します。

このようなオブジェクトは、POJO (Plain Old Java Object)とも呼ばれます。この用語は、トリッキーな動作をするさまざまなオブジェクトの対義語としてよく使用されます。Mockito が作成した Moc オブジェクトを覚えていますか? ここではそれらはPOJOではありません。

一部のクライアント コードが一時ステータスのオブジェクトを操作する場合、その相互作用は非常に単純なスキームで説明できます。

永続的または管理対象

次に一般的なケースは、Hibernate エンジンに関連するオブジェクトです。それらのステータスは永続的 (または管理対象) と呼ばれます。このステータスのオブジェクトを取得するには、正確に 2 つの方法があります。

  • Hibernate からオブジェクトをロードします。
  • Hibernate でオブジェクトを保存します。

例:

Employee employee = session.load(Employee.class, 1);
Employee employee = new Employee ();
session.save(employee);

このようなオブジェクトは通常、データベース内の何らかのレコードに対応し、ID などを持ちます。このオブジェクトは Hibernate セッションに接続されており、一般に実際のオブジェクトではなく、ある種のプロキシによって表すことができます。

session.load()メソッドを呼び出した後、いくつかのスタブ オブジェクト (プロキシ) が返され、データベースへのすべての呼び出しがこのオブジェクトのメソッドを呼び出した後にのみ実行される可能性は十分にあります。ただし、そのような詳細については、少し後で説明します。

また、クライアント コードと管理対象ステータスのオブジェクト間の対話は、次の図で説明できます。

独立した

次の状態は、オブジェクトがセッションから切り離されたときです。つまり、オブジェクトが Hibernate セッションにアタッチされた後、セッションが閉じられるかトランザクションが終了すると、Hibernate はこのオブジェクトを監視しなくなります。

例:

session.close();
session.evict(entity);

最初の例では、セッションが閉じられました。2 番目のケースでは、 evict()メソッドを使用してセッションからオブジェクトを切り離したいことを明示的に示しています。

新しいコードとオブジェクトの相互作用スキームは次のようになります。

ここからが興味深いところです。オブジェクトが Hibernate から取得された場合は、実際のオブジェクトではなくプロキシが与えられた可能性があります。そして、このプロキシ オブジェクトは、セッションから切断された後、そのメソッドが呼び出されたときに例外をスローします。

これは、Hibernate を使用する場合にすべての初心者にとって最も一般的な問題です。Entity オブジェクトを操作するときは、次のような質問に対する答えを常に正確に知っておく必要があります

  • 実際のオブジェクトはありますか、それとも実際のオブジェクトからの単なるプロキシですか?
  • 現在取引中ですか?
  • 読み取り/書き込みトランザクションですか、それとも読み取り専用トランザクションですか?
  • オブジェクトは LazyLoading メカニズムによって管理されていますか?
  • オブジェクトのどの部分が既にメモリにロードされており、アクセス時にどの部分がロードされるのでしょうか?
  • オブジェクトは依存オブジェクトにどのように接続されていますか?

幸いなことに、ほとんどの場合、それは明白です。ただし、内部ですべてがどのように機能するかを理解する必要があります。宣言型プログラミングとはそういうものです - コードは 10 分で記述でき、コードが正常に動作しない理由を 10 時間で理解できます :)

削除されました

そして、Entity オブジェクトが取り得る最後の状態は Removed です。おそらくその名前からすでに推測されているように、これはリモート オブジェクトの状態です。

この状態は、データベースからオブジェクトを削除しても、Java オブジェクトがすぐにはどこにも消えないという事実により表示されます。

Employee employee = session.load(Employee.class, 1);
//after loading the object's state is Persisted

session.remove(employee);
//after deletion, the state of the object is Removed

session.save(employee);
//and now Persisted again

session.close();
//and now the Detached state