0

次の点についてご回答をお願いします。アプリケーションではエンティティの状態が更新されないのに、データベースでは更新される理由は何ですか。

簡単な例。

System.print.out.println(patio.getName()); // = "HisYard"
patio.setName("MyYard");
session.saveOrUpdate(patio);
session.persists(patio);
session.flush();
session.commit();
session.disconnect();

------MySql Database-------
id_patio = 3
name = "MyYard"
------Database-------

Later on the same application...

Session session = HibernateUtil.getSessionFactory().openSession();
int niceNeigborhood = 3;
Neighborhood neighborhood = (Neighborhood)session.load(Neighborhood.class, niceNeigborhood);
session.refresh(neighborhood);
String whosYardIsThis = neighborhood.getHouse().getPatio().getName();
System.print.out.println(whosYardIsThis); // = "HisYard" !!!!!!!

ご覧のとおり、何も、フラッシュ、コミット、更新、保存、何も機能しません。しかし、私のデータベースは更新されていますが、エンティティは更新されていません。

助けてください。

4

1 に答える 1

0

丸一日ブログや投稿を読んだ後、この問題の解決策を見つけることができました。基本的に、問題は次のとおりです。すべてのプロパティが「適切に」更新された特定のエンティティの更新されたインスタンスを取得する場合、ビジネス ロジックでオブジェクトをトラバースして特定のエンティティに到達する必要がある場合は、lazy を設定する必要があります。中間オブジェクトのコレクション マッピング タグに ="false" を指定します。私の例:

String whosYardIsThis = neighborhood.getHouse().getPatio().getName();

プロパティが実際に更新された Patio オブジェクトを取得するには (以前はプロジェクトの他の部分で)、 Houseの Collection of Neighborsを次のようにマップする必要があります。

<set name="neighborhood" inverse="true" cascade="all-delete-orphan" lazy="false">

そのため、データは常に最新の状態に保たれ、面倒なキャッシュからではなく、まさにデータベースからフェッチされます。

私のよりも良い説明については、専門家をチェックしてください: 6.2. コレクションのマッピング

于 2012-10-11T05:46:50.793 に答える