2012-09-26 1 views
0

Spring 3.1.2, Neo4J 1.8.RC1 및 SpringData 2.1.0.RC3으로 업그레이드 한 후 다음과 같은 문제가 발생합니다. 나는 아주 기본적인 테스트를 실행SpringData Neo4J - 리포지토리가 @GraphId를 변경하지 않습니까?

<!-- 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이 아닌 이유는 무엇입니까?

public interface MascotRepository extends GraphRepository<Mascot> {} 

마스코트 자체가 매우 기본적인 NodeEntity입니다 : 다음과 같이

MascotRepository은 정의 중 하나

@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는 부분적이므로 AspectJ (기본 ActiveRecord 메소드 추가 용)에 의해 수정된다. Neo4J 순수 엔티티가 아닌 부분적 NodeEntities 만 이렇게 수정 될 수 있습니까? 그렇지 않으면 저장소와 충돌을 일으킬 수 있습니까?

아이디어가 있으면 미리 감사드립니다. 롤프는

+0

내가 어쩌면 거래에 문제가 있습니다. 로그의 "Outside of transaction, 필드 클래스에서 얻은 값 ..."을 많이 봅니다 ... – Rolf

+0

NPE는 어디에서 발생합니까? 테스트를 위해 github 또는 dropbox에서 프로젝트를 공유 할 수 있습니까? Thx –

+0

안녕하세요, 귀하의 성원에 감사드립니다. 여기 있습니다 : https://github.com/LateralThoughts/DevInLove/tree/meetup-unstable. 그냥 'mvn test'를 실행하여 문제를 재현하십시오. – Rolf

답변

0

는 내가의 transactionManager 빈의 올바른 정의는이 생각 :

<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"/> 
+0

thx, 한번 해보겠습니다. – Rolf