MirageではGuiceとの連携用にMirageModuleというモジュールを提供しており、これを使用するとSqlManagerをDIできるようになります。が、提供しているのはそれだけで、トランザクション管理などは自前でなんとかしてください、というスタンスでした。
もちろんWebアプリであればMirageが標準で提供しているOpenSessionInViewFilterを使ってもよいのですが、Guice管理下のコンポーネントの任意のメソッドをトランザクション境界としたい場合のために@Transactionalというアノテーションを付与しておくと自動的にトランザクションの制御を行う機能を追加してみました。使い方はこんな感じです。
public void EmployeeDao { @Inject private SqlManager sqlManager; @Transactional public Employee getEmployee(long empId){ ... } }
@TransactionalアノテーションがついてるメソッドにTransactionInterceptorが適用され、メソッドの開始前にトランザクションが開始され、メソッドの実行後にコミットされます。メソッドが例外をスローした場合、トランザクションはロールバックされます。
例外を投げずにトランザクションをロールバックする機能も必要かなぁ…。よく考えたらOpenSessionInViewFilteを使う場合も例外をスローしないとトランザクションをロールバックできないですね。
ちなみにこのインターセプターはAOP Allianceな実装なので、SpringやSeasar2などでも使えるはず。ただ、Seasar2やSpringは自前でトランザクション制御の機能があるし、そっちのほうがなにかとメリットが多いのでわざわざMirageのインターセプターを使うメリットはないと思いますが…。