1

JDBCを使用してDBにデータを保存するためにプレーンJavaクラスを呼び出すGrailsサービスメソッドがあります。次に、grailsサービスメソッドも同じDBに書き込みます。これはすべて同じトランザクションで発生するはずです。

def dataSource

def myServiceMethod() {
    MyJDBCClass jdbcClass = new MyJDBCClass(dataSource.getConnection())
    jdbcClass.savePerson(new PersonDto("Bob"))

    Person p = Person.findByFirstName("Bob")
    p.firstName = "John"
    if (p.firstName == "John") {
        throw new RuntimeException("Test rollback of Bob")
    }
    p.save()
}

myServiceMethodは現在、デフォルトの伝播タイプであるPROPAGATION_REQUIREDを使用しています(サービスメソッドであるため)。

MyJDBCClassは純粋なJava/JDBCであり、別のJARファイルに含まれているため、Springのトランザクション管理に依存することは理想的ではありません。どうすればいいのかよくわかりません。

ありがとう!

4

1 に答える 1

0

コメントに記載されているように、使用dataSource.getConnection()すると、動的GORMメソッドで使用されるのと同じ接続が得られます。

groovy.sql.Sqlまた、これがインスタンスを宣言する正しい方法であることに注意してください。

sql = new Sql(dataSource.getConnection())

のように宣言すると

sql = new Sql(dataSource)

SQL コマンドが異なる接続を使用している可能性があります (Oracle データベースで発生します)。

もう 1 つの可能性は、cacheConnectionクロージャーを使用して、groovy sql のすべての実行で同じ接続が使用されるようにすることです。

于 2013-02-22T16:56:40.477 に答える