Во-первых, я точно знаю, что использую Spring Data для Neo4J 2.2.0-release и Scala 2.10.Spring/Neo4J - непостояннаGraphDatabase совместима с аннотацией транзакции?
Я собираю несколько тестов для тестирования своих приложений.
Здесь мои различные файлы в порядке вызова (я точный, что ее концептуальный образец, но тестировался):
MeetingServices.scala
@Service
class MeetingServices {
@Transactional
def save(meeting: Meeting, creator: User): ValidationNel[MeetingFailure, Meeting] = {
try {
meetingRepository.save(meeting, creator).successNel[MeetingFailure]
} catch {
case e: Throwable => MeetingFailure("Fail to create the Meeting " + meeting + "for the user :" + creator, Some(e)).failNel[Meeting]
}
}
}
Сохранить метод в MeetingRepository.scala:
def save(meeting: Meeting, creator: User): Meeting = { //no need to declare a transaction since this method call is wrapped inside the previous save() method of MeetingServices
creator.participateIn(meeting)
meeting.creator = creator
meetingRepository.save(meeting)
}
Interestin г выдержка из User.class:
@RelatedTo(`type` = "PARTICIPATES_IN")
val meetings: java.util.Set[Meeting] = new java.util.HashSet[Meeting]()
def participateIn(meeting: Meeting) = {
meeting.creator = this // since bidirectional relation
meetings.add(meeting) //#needs_transaction
}
Так что проблема ?:
В производстве, все работает хорошо. Транзакция происходит, и моя встреча сохраняется и связана с ее создателем (User neo4j-relationship). Но в моем окружении я получил следующее: NotInTransactionException
. Почему? Поскольку в строке, аннотированной с помощью #needs_transaction (в выдержке выше), аннотация «Отношения» ожидает транзакции, и, похоже, в ходе тестов транзакция не создается.
Я использую два разных приложения-context.xml для конфигурации Spring, один для моих тестов, второй для приложения в производстве. Один используется для испытаний является следующее:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/neo4j
http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<neo4j:config graphDatabaseService="graphDatabaseService"/>
<bean id="graphDatabaseService" class="org.neo4j.test.ImpermanentGraphDatabase" />
<neo4j:repositories base-package="repositories"/>
<context:spring-configured/>
<context:annotation-config/>
<context:component-scan base-package="controllers, services, models,repositories"/>
<tx:annotation-driven mode="aspectj"/>
</beans>
Один я использую в производстве:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/neo4j
http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<neo4j:config graphDatabaseService="graphDatabaseService"/>
<bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
<constructor-arg index="0" value="http://myUrl/db/data/"/>
<constructor-arg index="1" value="111111"/>
<constructor-arg index="2" value="111111"/>
</bean>
<neo4j:repositories base-package="repositories" />
<context:spring-configured/>
<context:annotation-config/>
<context:component-scan base-package="controllers, applicationservices, models,repositories"/>
<tx:annotation-driven mode="aspectj"/>
</beans>
Это действительно кажется, что ImpermanentGraphDatabase не связана с какой-либо сделки, объявленной весной .... Как я мог быть так уверен? Потому что я сначала переключил application-context.xml
на тесты, полученные от производства (используя Neo4j REST-вызовы), не касаясь ничего в коде моего теста, и все работает хорошо.
Я что-то пропустил?
Заранее спасибо :)
--------------- EDIT ------------
На самом деле, это работает только с Noe4j Rest calls. С встроенной базой данных или с ImpermanentDatabase возникает ошибка.
Я отправил вчера более точное объяснение моего вопроса здесь: https://groups.google.com/forum/?fromgroups=#!topic/neo4j/ Ru6J08F1np8 Мой класс обслуживания (содержащий метод 'save') аннотируется с помощью @Service и представлен в пакетах приложений (так сканируется функцией-скана весны). – Mik378
Я поставил демо-версию здесь, для тех, кто интересен: https://github.com/mica16/TransactionNeo4JIssue.git – Mik378