Toshiya_Kobay****@sunmo*****
Toshiya_Kobay****@sunmo*****
2006年 3月 10日 (金) 15:01:50 JST
小林です。 > <<私の超訳>> > EntityManagerは、通常はデータベースがコミットするときに同期します。 > でも、それに先立ってDBクエリーが実行されるときはその前にも同期します。 おおー、 ちょうど私もそういう風にしようかと思ってたんです。 それでいきましょう。 ありがとうございました > 翻訳よりも、こういう内容の話の方がずーっと面白いです。 面白ついでに EJB3.0仕様Proposed Final Draftをみたところ、 3.5.2 Queries and FlushMode に The flush mode setting affects the result of a query as follows. When queries are executed within a transaction, if FlushMode.AUTO is set on the Query object, or if the flush mode setting for the persistence context is AUTO (the default) and a flush mode setting has not been specified for the Query object, the persistence provider is responsible for ensuring that all updates to the state of all entities in the persistence context which could potentially affect the result of the query are visible to the processing of the query. The persistence provider implementation may achieve this by flushing those entities to the database or by some other means. In the absence of such flush mode settings, the effect of updates made to entities in the persistence context upon queries is unspecified. If there is no transaction active, the persistence provider must not flush to the database. とあり、同期をとるのはpersistence providerとされています。 またpersistence providerは以下のように説明されています。 [1] The term "persistence provider runtime" refers to the runtime environment of the persistence implementation. In Java EE environments, this may be the Java EE container or a third-party persistence provider implementation integrated with it. mikiさんの仰るとおり、 件の翻訳部分の段落はEntityManagerの話をしているはずなのですが、 「EntityManagerは〜同期します」 の主語はEntityManagerではあてはまらない気がします。 私の理解では persistence providerが永続化機構そのものであるのに対して EntityManagerはPOJOプログラマが永続化を扱うためのラッパに過ぎず、 (EntityManagerもたしかにpersistence providerを通して永続化処理を行うが) コンテナが自動で行う同期処理では、 コンテナはEntityManagerを使わなくても構わない、 ということになります。 (使っていても全然構わないのですが) TrailBlazersにいきなり永続化プロバイダという単語を持ち出すわけにもいかないので 「コンテナは〜同期します」 が妥当ではないでしょうか どうでしょう?