5

私は、Spring Data Neo4j 2.0 で単純なオブジェクト/グラフ マッピングを使用しています。ここでは、Spring Data リポジトリ フレームワークを使用して永続化操作を実行しています。Neo4jTemplate を使用するのではなく、リポジトリを使用しています。リポジトリを Spring Web MVC コントローラーに挿入すると、コントローラーはリポジトリを直接呼び出します。(中間サービス層はありません。私の操作は通常、CRUD とファインダー クエリです。)

読み取り操作を行う場合、問題はありません。しかし、書き込み操作を行うと、「NotInTransactionException」が発生します。私の理解では、Neo4j の読み取り操作はトランザクションを必要としませんが、書き込み操作は必要です。

単純な OGM に固執したい場合、ここで取引を把握するための最良の方法は何ですか? @Transactional を使用したいのですが、それをさまざまなリポジトリ インターフェイスに配置してもうまくいきません。コントローラーとリポジトリーの間に中間サービス層を導入し、サービス Bean に @Transactional のアノテーションを付けるとうまくいきますが、もっと簡単な方法はないかと考えています。Spring Data がなければ、通常は DAO (リポジトリ) 実装にアクセスできるため、パススルー サービス層を回避したい場合は、具体的な DAO に @Transactional でアノテーションを付けることができます。Spring Data では、リポジトリが動的に生成されるため、それはオプションではないようです。

4

1 に答える 1

7

まず、トランザクション DAO を使用することは、一般的には良い方法ではないことに注意してください。ただし、サービス レイヤーがない場合は、DAO に配置します。

その後、宣言型トランザクションを有効にできます。これが私がそれをした方法です:

まず、 という注釈を定義します@GraphTransactional

@Retention(RetentionPolicy.RUNTIME)
@Transactional("neo4jTransactionManager")
public @interface GraphTransactional {

}

更新: spring-data-neo4j はそのような注釈を追加したため、新しい注釈を作成する代わりに再利用できます。@Neo4jTransactional

次に、 にapplicationContext.xml次のものを用意します (neo4jdbはあなたのEmbeddedGraphDatabase):

<bean id="neo4jTransactionManagerService"
    class="org.neo4j.kernel.impl.transaction.SpringTransactionManager">
    <constructor-arg ref="neo4jdb" />
</bean>
<bean id="neo4jUserTransactionService" class="org.neo4j.kernel.impl.transaction.UserTransactionImpl">
    <constructor-arg ref="neo4jdb" />
</bean>

<bean id="neo4jTransactionManager"
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="neo4jTransactionManagerService" />
    <property name="userTransaction" ref="neo4jUserTransactionService" />
</bean>

<tx:annotation-driven transaction-manager="neo4jTransactionManager" />

別のトランザクション マネージャーも使用する場合はorder="2"、このアノテーション駆動型の定義を指定する必要があることに注意してください。 sql と neo4j の両方のトランザクションであること。

于 2012-01-07T23:11:30.313 に答える