5

我在 Spring Data Neo4j 2.0 中使用简单的对象/图形映射,我使用 Spring Data 存储库框架执行持久性操作。我正在使用存储库而不是使用 Neo4jTemplate。我将存储库注入到我的 Spring Web MVC 控制器中,控制器直接调用存储库。(没有中间服务层——我的操作通常是 CRUD 和查找器查询。)

当我进行读取操作时,没有问题。但是当我写操作时,我得到“NotInTransactionException”。我的理解是 Neo4j 中的读取操作不需要事务,但写入操作需要。

假设我想坚持使用简单的 OGM,那么在这里将交易纳入图片的最佳方式是什么?我想使用@Transactional,但把它放在各种存储库接口上是行不通的。如果我在控制器和存储库之间引入一个中间服务层,然后用 @Transactional 注释服务 bean,那么它可以工作,但我想知道是否有更简单的方法来做到这一点。如果没有 Spring Data,我通常可以访问 DAO(存储库)实现,因此如果我想避免传递服务层,我可以使用 @Transactional 注释具体的 DAO。使用 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 回答