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 のみがこのように変更されていることを確認できますか? そうでない場合、リポジトリと競合する可能性がありますか?
アイデアがあれば、事前に感謝します! ロルフ