4

アプリケーションで Postgres、MongoDB、および Neo4j を一緒に使用したいと考えています。私はそれらすべてを構成することができましたが、今では私の POJO のそれぞれが私のグラフノードとアスペクト J による文書に支えられています。

どのPOJOがgraphNodeのみによってサポートされ、どのPOJOがドキュメントのみによってサポートされているかを除外する方法はありますか?

1 回のリクエストで 2 回以上 [sic!] POJO を保存すると問題が発生し、ログを見ると、mongo と neo4j の両方が多くのインスタンスを作成しようとしていて、デッドロックの原因となっていることがわかります。

簡単に言えば:

  1. pojo "A" を RDBMS とグラフ (ドキュメントなし) でマッピングし、pojo B をドキュメントとグラフ (RDBMS なし) でマッピングするようにデータ マッピングをフィルタリングする方法はありますか?
  2. 私の問題を多かれ少なかれカバーするクロスストアの春のデータベースのアプリケーションのサンプルはありますか?
  3. コントローラーに pojo クラスの 2 つのインスタンスを 1 つずつ保存できるのに、3 つ目のインスタンスが作成されるとデッドロックが発生するのはなぜですか?

[編集]

私が気づいたこと:

  1. Mongospectjビルダーは@Entityアノテーション付きPOJOをサポートしていますが、@Entityを使用してMongoDBではなくHibernate用にPOJOをマップする方法がわかりません
  2. Neo4j 関連のフリーズは、REST 経由で接続した場合にのみ発生し、3 番目の場合も 4 番目の場合もあり、まったく発生しない場合もあります。コントローラーの開始方法を参照してください。コメントされたすべての行を試しましたが、成功しませんでした。
  3. トランザクション マネージャーの構成は正しい場所に配置する必要があります。そうしないと、Neo4J 構成バリデータ サービスが失敗します。

[/編集]

私が使う:

  1. 春 3.0.5
  2. スプリングルー 1.4
  3. スプリングデータ 1.0
  4. Postgres 9.0 + Hibernate 3.5.5
  5. Neo4j 1.3 リモート
  6. MongoDB 1.8.2 リモート
  7. すべての DB は単一のリモート マシン上にあり、正常に動作します

[編集]

POM スライス:

<properties>
    <roo.version>1.1.4.RELEASE</roo.version>
    <spring.version>3.0.5.RELEASE</spring.version>
    <aspectj.version>1.6.11</aspectj.version>
    <slf4j.version>1.6.1</slf4j.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring-security.version>3.0.5.RELEASE</spring-security.version>
    <jackson.version>1.8.0</jackson.version>
    <spring.data.mongodb.version>1.0.0.M2</spring.data.mongodb.version>
    <spring.data.graph.version>1.0.0.RELEASE</spring.data.graph.version>
    <spring.data.commons.version>1.0.0.RELEASE</spring.data.commons.version>
</properties>
    ...
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-neo4j</artifactId>
        <version>${spring.data.graph.version}</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb-cross-store</artifactId>
        <version>${spring.data.mongodb.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>${spring.data.mongodb.version}</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-neo4j-rest</artifactId>
        <version>${spring.data.graph.version}</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons-core</artifactId>
        <version>${spring.data.commons.version}</version>
        <scope>compile</scope>
    </dependency>

  ....
  <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.0</version>
            <dependencies>
                <!-- NB: You must use Maven 2.0.9 or above or these are ignored (see 
                    MNG-2972) -->
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjrt</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <outxml>true</outxml>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aspects</artifactId>
                    </aspectLibrary>
                                            <aspectLibrary>
                        <groupId>org.springframework.data</groupId>
                        <artifactId>spring-data-neo4j</artifactId>
                    </aspectLibrary>
                    <aspectLibrary>
                        <groupId>org.springframework.data</groupId>
                        <artifactId>spring-data-mongodb-cross-store</artifactId>
                    </aspectLibrary>

                </aspectLibraries>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

ポジョ:

@NodeEntity
@RooToString
@RooJavaBean
public class DElement {

@Indexed
private Long id;

@RelatedTo(direction=Direction.BOTH, elementClass=DRegion.class, type="SUBELEMENT_OF")
private Set<DElement> childElements = new HashSet<DElement>();

@Indexed(indexName = "delement-name", fulltext=true)
private String name;    



@Transactional
public void addChild(DElementchild child)
{
    this.childElements.add(child);
}

}

コントローラ(ローディングあり):

    @Controller
    @RequestMapping(value="/DElements")
    public class DElementsController {

        DElementRepository DElementRepository;

        GraphDatabaseContext gdbc;

        @Autowired
        public DElementsController(DElementRepository DElementRepository, GraphDatabaseContext gdbc)
        {
            this.DElementRepository = DElementRepository;
            this.gdbc = gdbc;
            this.initElements();
        }

        @Transactional
        private void initElements()
        {
            try
            {
                DElementRepository.deleteAll();

            } 
            catch (Exception e) {} finally{}

            //Transaction txn = gdbc.beginTx();

            referenceNode.createRelationshipTo(allElements.getPersistentState(), myRelation);

            DElement naElements = new DElement().persist();
            naElements.setName("1");
            allElements.addChild(naElements);

            DElement saElements = new DElement().persist();
            saElements.setName("2");
            allElements.addChild(saElements);               

            DElement euElements = new DElement().persist();
            euElements.setName("3");
            allElements.addChild(euElements);

            DElement afElements = new DElement().persist();
            afElements.setName("4");    
            allElements.addChild(afElements);

            DElement asElements = new DElement().persist();
            asElements.setName("5");    
            allElements.addChild(asElements);

            DElement auElements = new DElement().persist();
            auElements.setName("6");
            allElements.addChild(auElements);


            //txn.success();
            //txn.finish();

        }
    }

applicationContext.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xmlns:graph="http://www.springframework.org/schema/data/graph"
    xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/data/graph http://www.springframework.org/schema/data/graph/datagraph-1.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:property-placeholder location="classpath*:META-INF/spring/*.properties" />
    <context:spring-configured />
    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

    <context:component-scan base-package="com.foobar">
        <context:exclude-filter expression=".*_Roo_.*"
            type="regex" />
        <context:exclude-filter expression="org.springframework.stereotype.Controller"
            type="annotation" />
    </context:component-scan>
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/foobar" />




    <mongo:mongo host="${foobar.mongodb.addr}" port="27017" />
    <mongo:mapping-converter base-package="com.foobar.lib.model.mongo"/>

    <bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
        <constructor-arg name="mongo" ref="mongo" />
        <constructor-arg name="databaseName" value="foobar" />
        <constructor-arg name="defaultCollectionName" value="basecoll" />
    </bean>

    <bean class="org.springframework.data.document.mongodb.MongoExceptionTranslator" />

    <!-- Mongo cross-store aspect config -->
    <bean
        class="org.springframework.data.persistence.document.mongo.MongoDocumentBacking"
        factory-method="aspectOf">
        <property name="changeSetPersister" ref="mongoChangeSetPersister" />
    </bean>
    <bean id="mongoChangeSetPersister"
        class="org.springframework.data.persistence.document.mongo.MongoChangeSetPersister">
        <property name="mongoTemplate" ref="mongoTemplate" />
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>


    <bean 
        id="graphDatabaseService" class="org.neo4j.kernel.EmbeddedGraphDatabase"
        destroy-method="shutdown" >
        <constructor-arg index="0" value="c:/neo4j/data/foobar" />
    </bean>
<!--  REST DOESNT WORK FOR THE MOMENT
    <bean id="graphDatabaseService" class="org.springframework.data.graph.neo4j.rest.support.RestGraphDatabase">
        <constructor-arg value="${foobar.neo4j.reststore}"/>        
    </bean> -->


<!--    <bean id="graphDatabaseContext" class="org.springframework.data.graph.neo4j.support.GraphDatabaseContext">
        <property name="graphDatabaseService" ref="graphDatabaseService"/>
    </bean> -->

    <graph:repositories base-package="com.foobar.data.repositories.neo4j" graph-database-context-ref="graphDatabaseContext"/>


    <graph:config graphDatabaseService="graphDatabaseService" entityManagerFactory="entityManagerFactory" />
    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />    

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">     
        <property name="dataSource" ref="dataSource" />
    </bean> 
</beans>

[/編集]

4

1 に答える 1

4

いくつかの一般的な意見。

Graph-JPAクロスストア永続性を使用する場合にのみ、entityManagerFactoryをSpringDataGraphに渡す必要があります。例はここにあります。その場合は、クロスストア設定に参加するPOJOでpartial=trueフラグも有効にする必要があります。

Spring DataGraphCrossストアとSpringDataMongoDBクロスストアは、JPAとの対話方法が異なり、SDGは、(@ Idフィールドを介して)JPAエンティティに(再)接続されているエンティティを永続化またはロードするときに、GraphPOJO側から機能します。 。

一方、Spring Data MongoDBは、AspectJを使用して、EntityManagerのメソッドの一部を拡張し、ドキュメントデータベースのライフサイクルイベントを開始します。

現在、MongoDBとNeo4jを統合するストーリーはありません。しかし、私たちとして、両方のプロジェクトのプロジェクトリーダーは同じ都市に住んでいて、緊密に協力しています。それは実行可能であるはずです。

github(プライベートリポジトリ[私のgithubidは"jexp"、またはメールまたはドロップボックスごと)のいずれかで、完全なプロジェクトコードをどこかで共有できれば素晴らしいと思います。直接掘り下げることができるように。

あなたの質問に:

  • グラフ+rdmbsは、partial = trueを持つすべてのエンティティであり、POJOに@Entityアノテーションを付ける必要があります
  • mongo-cross-storeの永続性がどのように正しく構成されているかわかりません
  • 通常、エンティティがマップされるストアであるpersistence.xmlを介して構成する必要がありますか?
  • つまり、EntityManager / JPA/RDMBSと対話するストアごとにpersistence.xmlを構成するというメカニズムを考案する必要があるかもしれません。
  • おそらくそれは、2つのエンティティマネージャーを1つをグラフ用に、もう1つをmongo用に定義することによっても機能しますか?
  • おそらく最初にneo4jの組み込みモードで実行し、後でリモートサーバー(REST)を調べる必要があります
  • Spring Data Graphを1.1.M2に、Neo4jを1.4に、AspectJを1.6.12.M1に更新する必要があります。

私たちがすべての問題を解決し、良い解決策に到達できるように、個人的に接続してください。

于 2011-07-22T00:00:04.973 に答える