私は現在、@Transactional
アノテーションが Neo4j のトランザクションを開始していないように見えるという問題を抱えています (次の例だけでなく、私の@Transactionalアノテーション付きメソッドでは機能しません)。
例:
このメソッド ( UserService.createUser
) は、最初に Neo4j グラフにユーザー ノードを作成し、次に MongoDB にユーザーを (追加情報と共に) 作成します。(MongoDB はトランザクションをサポートしていないため、最初にユーザー ノードを作成し、次にエンティティを MongoDB に挿入し、その後 Neo4j トランザクションをコミットします)。
このメソッドには、Neo4j でユーザーを作成する際に@Transactional
まだスローされるアノテーションが付けられています。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();
}
}
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);
}
...
}
補足:
- spring バージョン
3.2.3.RELEASE
と spring-data-neo4j バージョンを使用しています2.3.0.M1
- UserServiceとNeo4jConfigは別の Maven アーティファクトにあります
- サーバーの起動と SDN 読み取り操作はこれまでのところ機能していますが、書き込み操作に問題があります
- 私は現在、プロジェクトをティンカーポップ フレームワークから SDN-Neo4j に移行しています。このユーザー作成プロセスは以前 (tinkerpop で) 機能していましたが、SDN-Neo4j で再度機能させる必要があります。
- Jetty でアプリケーションを実行しています
なぜこれが(まだ)機能しないのか、誰にも手がかりがありますか?
この情報で十分だと思います。不足しているものがあればお知らせください。追加します。
編集:
手動のトランザクション処理が機能することを忘れていましたが、もちろん、「本来あるべき」方法で実装したいと考えています。
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();
}
}