首先,请注意,拥有事务性 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 事务。