Во-первых, обратите внимание, что транзакционные 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.