2013-09-05 3 views
0

я в настоящее время имеющий вопрос, что @Transactional аннотаций, кажется, не начать транзакцию для Neo4j, но (он не работает ни с одним из моих @Transactional аннотированных методов, а не только со следующим примером).@Transactional не имеет никакого эффекта

Пример:

У меня есть этот метод (UserService.createUser), который создает пользовательский узел в Neo4j графике первого, а затем создает пользователь (с дополнительной информацией) в MongoDB. (MongoDB не поддерживает транзакции, поэтому сначала создайте узел пользователя, затем вставьте объект в MongoDB и затем совершите транзакцию Neo4j).

Метод аннотируется @Transactional, но при создании пользователя в Neo4j выбрасывается org.neo4j.graphdb.NotInTransactionException.

Вот о моей конфигурации и кодирования, соответственно:

код на основе конфигурации SDN-Neo4j:

@Configuration 
@EnableTransactionManagement      // mode = proxy 
@EnableNeo4jRepositories(basePackages = "graph.repository") 
public class Neo4jConfig extends Neo4jConfiguration { 
    private static final String DB_PATH = "path_to.db"; 
    private static final String CONFIG_PATH = "path_to.properties"; 

    @Bean(destroyMethod = "shutdown") 
    public GraphDatabaseService graphDatabaseService() { 
     return new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(DB_PATH) 
      .loadPropertiesFromFile(CONFIG_PATH).newGraphDatabase(); 
    } 
} 

Service для создания пользователя в Neo4j и MongoDB:

@Service 
public class UserService { 
    @Inject 
    private UserMdbRepository mdbUserRepository; // MongoRepository 
    @Inject 
    private Neo4jTemplate neo4jTemplate; 

    @Transactional 
    public User createUser(User user) { 
     // Create the graph-node first, because if this fails the user 
     // shall not be created in the MongoDB 
     this.neo4jTemplate.save(user);    // NotInTransactionException is thrown here 
     // Then create the MongoDB-user. This can't be rolled back, but 
     // if this fails, the Neo4j-modification shall be rolled back too 
     return this.mdbUserRepository.save(user); 
    } 

    ... 
} 

Примечания:

  • Я использую весеннюю версию 3.2.3.RELEASE и пружинные данные Neo4j версию 2.3.0.M1
  • UserService и Neo4jConfig находится в отдельной Maven артефактах
  • Запуск сервера и SDN чтение операции работают до сих пор, я У меня просто проблемы с записью
  • В настоящее время я переношу наш проект с платформы tinkerpop на SDN-Neo4j. Этот процесс создания пользователя уже работал (с tinkerpop), мне просто нужно снова работать с SDN-Neo4j.
  • Я бегу применение в Jetty

Кто-нибудь есть какие-либо понятия, почему это не работает (пока)?

Надеюсь, этой информации достаточно. Если что-то не хватает, сообщите мне, и я добавлю.


Edit:

Я забыл упомянуть, что ручные транзакционные погрузочно-разгрузочные работы, но, конечно, я хотел бы реализовать это путем «как это означало быть».

public User createUser(User user) throws ServiceException { 
     Transaction tx = this.graphDatabaseService.beginTx(); 
     try { 
      this.neo4jTemplate.save(user); 
      User persistantUser = this.mdbUserRepository.save(user); 
      tx.success(); 
      return persistantUser; 
     } catch (Exception e) { 
      tx.failure(); 
      throw new ServiceException(e); 
     } finally { 
      tx.finish(); 
     } 
    } 
+1

Где находится ваш бит 'TransactionManager'? –

+0

В суперклассе 'org.springframework.data.neo4j.config.Neo4jConfiguration.neo4jTransactionManager()' – Prjio

+0

Как создать экземпляр UserService? Можете ли вы перейти на 2.3.RC1? О, если вы используете SDN для сервера, вы не будете так счастливы, вероятно, лучше всего использовать свой код SDN в основном через Cypher или реализовать расширение сервера с использованием SDN и встроенного API. Лучшая производительность для удаленного сервера и SDN запланирована на будущее. –

ответ

0

Благодаря m-deinum я, наконец, нашел проблему. Проблема заключалась в том, что я сканировал эти компоненты/службы в другом файле конфигурации spring-configuration, чем там, где я настроил SDN-Neo4j.Я переместил компонент-сканирование для тех пакетов, которые могут потребовать операции в моем Neo4jConfig и теперь он работает

@Configuration 
@EnableTransactionManagement      // mode = proxy 
@EnableNeo4jRepositories(basePackages = "graph.repository") 
@ComponentScan({ 
    "graph.component", 
    "graph.service", 
    "core.service" 
}) 
public class Neo4jConfig extends Neo4jConfiguration { 
    private static final String DB_PATH = "path_to.db"; 
    private static final String CONFIG_PATH = "path_to.properties"; 

    @Bean(destroyMethod = "shutdown") 
    public GraphDatabaseService graphDatabaseService() { 
     return new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(DB_PATH) 
      .loadPropertiesFromFile(CONFIG_PATH).newGraphDatabase(); 
    } 
} 

я все равно придется разделить эти компоненты/услуги, которые требуют операции от тех, которые не отвечают, хотя. Однако это работает пока.

Я предполагаю, что проблема заключалась в том, что другой файл весны-конфигурации (который включал компонентное сканирование) был загружен до Neo4jConfig, так как neo4j:repositories должен быть помещен перед context:component-scan. (См. Примечание в примере 20.26. Композиционные репозитории http://static.springsource.org/spring-data/data-neo4j/docs/current/reference/html/programming-model.html#d0e2948)

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