Hibernate+Mysqlでレプリケーションを行った際に、以下のエラーが発生した。

●エラー内容
org.hibernate.HibernateException - Illegal attempt to associate a collection with two open sessions

●エラー発生タイミング
HibernateTemplate.update実行時

●原因
更新対象のオブジェクトの取得元がSELECTで実行しているためSlaveから取得していて、UPDATEをMasterに実行すると上記エラーが発生する。
レプリケーションのMaster・SlaveはHibernateのSessionFactoryオブジェクトを別々に定義している。

●対策
HibernateTemplate.updateでUPDATEを実行する際は、HibernateTemplate.updateに渡すオブジェクトをMasterから取得する。

●考察
今回レプリケーションを行うにあたって、Master・SlaveのSessionFactoryを別々に定義しているので、起きる問題ではないかと思う。
Hibernateは、O/Rマッピングのオブジェクトに対して、updateの対象オブジェクトの取得時のSessionFactoryを記録しておいて、update時に検証を行っているようだ。
なかなか賢いが、微妙に不便な気もする。
多分レプリケーションを行っていても、1つのSessionFactoryでMaster・Slaveへのアクセスを行っていれば、このエラーは出ないと思われる。(未検証)