2013-03-18 3 views
3

Во-первых, я точно знаю, что использую 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 возникает ошибка.

ответ

3

В REST API транзакций нет, каждый HTTP-запрос имеет свою собственную транзакцию. В java-rest-binding используется «Null-Transaction (Manager)».

Как ваша служба создала экземпляр/ввела? И как и где он используется? Возможно, вы можете поделиться примерным проектом с неудачным модульным тестом на github?

Конфигурация выглядит правильно, я предполагаю, что это что-то вроде того, как у вас есть служба, введенная из Spring, так что аспекты транзакции не применяются правильно.

Не знаю, если это поможет вам: http://www.cakesolutions.net/teamblogs/2012/03/29/neo4j-spring-data-scala/

+0

Я отправил вчера более точное объяснение моего вопроса здесь: https://groups.google.com/forum/?fromgroups=#!topic/neo4j/ Ru6J08F1np8 Мой класс обслуживания (содержащий метод 'save') аннотируется с помощью @Service и представлен в пакетах приложений (так сканируется функцией-скана весны). – Mik378

+0

Я поставил демо-версию здесь, для тех, кто интересен: https://github.com/mica16/TransactionNeo4JIssue.git – Mik378

Смежные вопросы