0

私は現在、@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
  • UserServiceNeo4jConfigは別の 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();
        }
    }
4

1 に答える 1

0

m-deinum のおかげで、ようやく問題が見つかりました。問題は、SDN-Neo4j を構成した場所とは異なる spring-configuration-file でこれらのコンポーネント/サービスをスキャンしたことです。トランザクションを必要とする可能性のあるパッケージのコンポーネントスキャンを自分に移動した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();
    }
}

ただし、トランザクションを必要とするコンポーネント/サービスを必要としないコンポーネント/サービスから分離する必要があります。ただし、これは今のところ機能します。

問題は、他の spring-configuration-file (コンポーネント スキャンを含む) が の前にロードされたことにあるとNeo4jConfig思いneo4j:repositoriesますcontext:component-scan。(例 20.26 の注を参照してください。リポジトリの構成http://static.springsource.org/spring-data/data-neo4j/docs/current/reference/html/programming-model.html#d0e2948 )

于 2013-09-06T14:22:16.163 に答える