я в настоящее время имеющий вопрос, что @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();
}
}
Где находится ваш бит 'TransactionManager'? –
В суперклассе 'org.springframework.data.neo4j.config.Neo4jConfiguration.neo4jTransactionManager()' – Prjio
Как создать экземпляр UserService? Можете ли вы перейти на 2.3.RC1? О, если вы используете SDN для сервера, вы не будете так счастливы, вероятно, лучше всего использовать свой код SDN в основном через Cypher или реализовать расширение сервера с использованием SDN и встроенного API. Лучшая производительность для удаленного сервера и SDN запланирована на будущее. –