2011-11-15 4 views
1

Hibernateで処理されるクラス内の特定のプロパティのget関数とset関数のセットを定義します。 set関数は、Hibernateのメカニズムと通常のコードの流れによって呼び出されるpublicなものです。Java Hibernate:誰が呼び出しているかに応じて異なるプロパティセット関数の動作

set関数がHibernateによって呼び出された場合、フィールドの値を設定するだけです。セットが別のソースから呼び出された場合は、追加のフィールドもそれに応じて更新する必要があります。

コードに2つの状況を区別する方法はありますか?または、この状況を処理するためのより良い方法がありますか?

答えて

2

これを処理する最も簡単な方法は、メソッドではなく直接フィールドにアクセスするようにHibernateを設定することです。その場合は、ゲッターとセッターに任意の種類のロジックを実装することができ、Hibernateはそれをトリガーしません。

アノテーションベースのアプローチを使用する場合、この動作はフィールドにアノテーションを配置することで設定できます。

あなたは、プロパティアクセサを使用する必要がある場合、あなたは同じフィールドに裏打ちされた2つのプロパティを作成することができます - 休止状態のための1つの(それはpublic非することができます)、および他のコードのためのもう一つは、(それを作るために@Transientとして注釈されなければなりませんHibernateはそれを無視します)。

+0

プロパティアクセサーを使用する必要がある場合はどうすればよいですか? – Yon

+0

@Yon:Updated ... – axtavt

+0

HibernateがIdまたはEmbeddedIdの位置からアクセスタイプを推測するため、フィールドアクセスとプロパティアクセスをアノテーションと混在させないように注意することが重要です。 – Christoph

0

Hibernateはそれをしません。これは、Hibernateではなく、あなたのコードに属するビジネスロジックです。 1つのことを行うORMソリューションです。永続オブジェクトです。それはあなたが背中の仕事をしているリレーショナルデータベースがあることを忘れさせようとします。

あなたが話しているのは、ソースに基づいたビジネスロジックと、あなたが気にしているかもしれないが表現していないことです。あなただけがそれを書くことができます。ユースケースを実装するサービスに入れます。それが横断的関心事なら、それを一面に置く。

+0

私は理解できません。このロジックをset関数に実装しないでください。 – Yon

+0

コードのどこかに実装する必要があります。 Hibernateは実装の一部にすぎません。私はそのロジックを永続クラスの外に置いていました。 – duffymo