Hatena::ブログ(Diary)

leftovers... このページをアンテナに追加 RSSフィード

2014-07-30

Grails 2.4.3 バグフィックスリリース!Hibernateでの注意点ある

Grails 2.4.3 バグフィックスリリース

そもそも、Grails 2.4.xて何?って人はコチラもチェック!

Grails 2.4.0 リリースきた!!!!


お約束の流れですがアップデートする場合は、もろもろプラグインのバージョンを更新しましょう。

Hibernateプラグインに関しては必須です。

今回は注意点として、 更新する場合は、DataSource.groovyhibernate configブロックに flush.mode = 'manual' を追加してください!!

runtime ':hibernate4:4.3.5.5' // or ':hibernate:3.6.10.17'

以下のプラグイン更新推奨です。

build ':tomcat:7.0.54'
compile ':cache:1.1.7'
compile ':scaffolding:2.1.2'
compile ':asset-pipeline:1.9.4'


Hibernate4プラグイン廻りでなんかあったっぽいので意訳してあります。間違ってたらゴメンね。

hibernate4プラグイン、バージョン4.3.5.5でのオートフラッシュのふるまい変更について。

In previous versions, the hibernate4 plugin's flush mode for the Open Session in View Interceptor (OSIVI) has been always "manual" regardless of the setting defined in hibernate config block's "flush.mode" setting. This has been changed to be consistent with hibernate plugin (Hibernate 3). This makes it easier to port existing applications using the hibernate plugin to hibernate4 plugin.

前バージョンまでのhibernate4プラグインOpen Session in View Interceptor (OSIVI)用のフラッシュモードは、hibernate configに"flush.mode"を設定しない限り常にマニュアルモードの状態です。この設定はhibernate3プラグインとの矛盾を防ぐ為に変更される必要があります。設定することにより hibernate3から hibernate4プラグインポートが容易になります。

IMPORTANT! It is recommended to set Hibernate OSIVI flush mode to "manual" for applications that haven't been upgraded from Hibernate 3 plugin. OSIVI flush mode was always "manual" for plugin versions before 4.3.5.5 version.

Add the "flush.mode = 'manual'" setting to the hibernate config block in grails-app/conf/DataSource.groovy file of your application

重要! Hibernate 3から更新指定無い場合は、Hibernate OSIVIフラッシュモードを"manual"への設定を推奨します。 Hibernateプラグインのバージョン4.3.5.5以前ではOSIVIフラッシュモードは常に"manual"に設定されています。

設定するには grails-app/conf/DataSource.groovyhibernate configブロックに"flush.mode = 'manual'"を追加します。

hibernate {
   …
   flush.mode = 'manual'
}

It should be noted that the default HibernateTransactionManager switches the flush mode of the current session to AUTO when the transaction starts. This behaviour exists in both Hibernate3 and Hibernate4. The flush mode setting of the OSIVI doesn't have effect in transactional context. The flush mode setting of the current session gets switched to MANUAL for read-only transactions.

注意点として、HibernateTransactionManagerでのデフォルトではフラッシュモードはトランザクションが開始するとセッションがAUTOに切り替わります。Hibernate3 と Hibernate4両方とも同じふるまいをします。フラッシュモードの設定をすることで、リードオンリーのトランザクションマニュアルに切り替わります。




Grails 2.4.3 の公式リリースノートはこちら。

http://grails.org/2.4.3+Release+Notes

JIRA http://jira.grails.org/secure/ReleaseNote.jspa?projectId=10020&version= 13814:title=http://jira.grails.org/secure/ReleaseNote.jspa?projectId=10020&version= 13814]

ダウンロード http://grails.org/Download

直リン grails-2.4.3.zip

ドキュメント http://grails.org/doc/2.4.3/

nobeansnobeans 2014/07/31 10:23 * トランザクション外でのDBアクセスに対する挙動がHibernate3/4プラグイン間で違っていた。3はauto相当(=自動フラッシュ)、4はmanual相当(=DBに反映されない!!)。
* Hibernate4プラグインでも、Hibernate3プラグインの挙動と合わせようと、DataSource.groovyにflush.mode="auto"などと指定しても無視されてた。(これがバグ)
* Grails2.4.3のリリースでは、これまでのHibernate4プラグインの挙動を変えずに、しかしHiberante3プラグインとの挙動の違いを明確にするために、DataSource.groovyでflush.mode = 'manual'を明示定義した。(あーmanualなのかーと気づきやすくなる効果?)

ということかと理解してます。

昔は、スキャフォルドコントローラでトランザクション外のDBアクセスを普通に使ってたのでこのH4の挙動にエッとなりますが、最近はコントローラのアクションでTransactionalアノテーションによるTxをデフォルトでかけているので、古いアプリをアップグレードしながら使う人以外はこの罠にはまる人は実は少なかったのでしょうかね。H3時代からアップグレードしたときは確実にハマりそう。

コントローラアクションでのTx境界は未だあまり好きになれないのだけど、このH4でのデフォ挙動のためにController=Tx必要説が更に強化される感じで無念です。

mottsnitemottsnite 2014/07/31 10:26 要約、ありがとう!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/mottsnite/20140730/1406726863