0

Spring 3.1.2、Neo4J 1.8.RC1、および SpringData 2.1.0.RC3 にアップグレードしたところ、次の問題が発生しました。

問題を説明する前に、ここに私のアプリケーション コンテキストの一部を示します。

<!-- Neo4J -->
<neo4j:config storeDirectory="target/graph.db" entityManagerFactory="entityManagerFactory"/>
<neo4j:repositories base-package="***.repository"/>

<!-- H2 -->
<jdbc:embedded-database type="H2" id="accountDataSource">
    <jdbc:script location="classpath:scripts/schema.sql" separator=";"/>
</jdbc:embedded-database>


<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="accountDataSource" />
    <property name="packagesToScan" value="***.domain" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="false" />
            <property name="databasePlatform" value="${database.dialect}" />
        </bean>
    </property>
</bean>

<!-- transactions -->
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<tx:annotation-driven mode="aspectj" />

私は非常に基本的なテストを実行します:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:devinlove-core.xml")
@Transactional
public class MascotRepositoryTest {

    @Autowired
    private MascotRepository mascotRepository;
    private Mascot mascot;

    @Before
    public void setup() {
        mascot = new Mascot();
        mascot.setName("Tux");
    }

    @Test
    public void when_inserting_then_retrievable() {
        assertThat(mascotRepository).isNotNull();
        mascotRepository.save(mascot);
        assertThat(mascot.getId()).isGreaterThan(0L);
    }
}

そして、テストは NPE で失敗します。保存操作後もマスコット ID が null にならないのはなぜですか?

MascotRepository は次のように定義されています。

public interface MascotRepository extends GraphRepository<Mascot> {}

Mascot 自体は非常に基本的な NodeEntity です。

@NodeEntity
@TypeAlias("mascot")
public class Mascot {
    @GraphId
    private Long id;

    @Indexed(indexType= FULLTEXT, indexName = "mascotSearch")
    private String name;

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Mascot{" +
            "id=" + id +
            ", name='" + name + '\'' +
            '}';
    }
}

これが問題に関連しているかどうかはわかりませんが、NodeEntity の 1 つが部分的であるため、AspectJ によって変更されています (基本的な ActiveRecord メソッドを追加するため)。純粋な Neo4J エンティティではなく、部分的な NodeEntities のみがこのように変更されていることを確認できますか? そうでない場合、リポジトリと競合する可能性がありますか?

アイデアがあれば、事前に感謝します! ロルフ

4

1 に答える 1

0

transactionManagerBeanの正しい定義は次のとおりです。

<bean id="jpaTransactionManager"
        class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="jtaTransactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager">
        <bean class="org.neo4j.kernel.impl.transaction.SpringTransactionManager">
            <constructor-arg ref="graphDatabaseService" />
        </bean>
    </property>
    <property name="userTransaction">
        <bean  class="org.neo4j.kernel.impl.transaction.UserTransactionImpl">
            <constructor-arg ref="graphDatabaseService" />
        </bean>
    </property>
</bean>
<bean id="transactionManager"
        class="org.springframework.data.neo4j.transaction.ChainedTransactionManager">
    <constructor-arg>
        <list>
            <ref bean="jpaTransactionManager"/>
            <ref bean="jtaTransactionManager"/>
        </list>
    </constructor-arg>
</bean>

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
于 2012-09-27T13:02:59.600 に答える