为什么不能为neo的spring数据创建neo4j关系?

时间:2015-02-02 00:15:43

标签: spring neo4j spring-data-neo4j

我对neo的弹簧数据相当新(虽然我有neo4j本身的经验)。我尝试按照关于neo的弹簧数据的“官方”指南,特别是关于creating relationships的章节。

但似乎我无法让它发挥作用。春天给了我一个

java.lang.IllegalStateException: This index (Index[__rel_types__,Relationship]) has been marked as deleted in this transaction

让我强调,我不会删除任何节点或关系。这些是我的域模型的相关类:

@NodeEntity
public class User {

    @GraphId
    private Long nodeid;

    @Indexed(unique = true)
    private String uuid;
    ....


}

@NodeEntity
public class Website {

    @GraphId
    private Long nodeid;

    @Indexed(unique = true)
    private String uuid;

    ....

}

@RelationshipEntity(type = RelTypes.REL_USER_INTERESTED_IN)
public class UserInterest {

    @GraphId
    private Long nodeid;

    @StartNode
    private User user;

    @EndNode
    private Website site;
    ...

}

这是我的基本测试,我无法变绿.. (请注意,我省略了大部分代码,弹簧上下文等的基本设置工作正常)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Transactional
public class BaseTest {

    @Autowired
    protected Neo4jTemplate template;
    @Autowired
    protected GraphDatabaseService graphDatabaseService;

    protected Transaction tx;

    @Configuration
    @EnableNeo4jRepositories
    static class TestConfig extends Neo4jConfiguration {
        TestConfig() throws ClassNotFoundException {
            setBasePackage("me.bcfh.model");
        }

        @Bean
        GraphDatabaseService graphDatabaseService() {
            return new TestGraphDatabaseFactory().newImpermanentDatabase();
        }

    }

    public void before() {
        // provide implementation if necessary
    }

    public void after() {
        // provide implementation if necessary

    }

    @Before
    public void setup() throws Exception {
        Neo4jHelper.cleanDb(graphDatabaseService, false);
        before();
    }

    @After
    public void tearDown() throws Exception {
        after();
        if (tx != null) {
            tx.success();
            tx.close();
            tx = null;
        }
    }
}
public class BasicGraphTest extends BaseTest {

    User user;
    Website website;
    UserInterest interest;

    @Override
    public void before() {
        user = new User();
        website = new Website();
        website = template.save(website);
        user = template.save(user);
    }

    @Test
    @Transactional
    public void dbShouldContainData() throws Exception {
        UserInterest interest = new UserInterest();
        interest.setSite(website);
        interest.setUser(user);
        template.save(interest);

        // some assertions 
        ... 
    }
}

当我尝试持久化UserInterest实例时会抛出IllegalStateException,我不明白,因为我没有删除任何地方。

春季指南中提到的建立关系的方式对我来说也不起作用,在这里我得到了同样的例外......

有谁能发现我在这里做错了什么?

我正在使用Spring版本4.1.4.RELEASE和Spring Data for Neo Version 3.2.1.RELEASE。 Neo4j的版本为2.1.6

注意:我也尝试将域模型类从cineasts示例复制到我的项目中,并借用了几行DomainTest类,但这也给了我IllegalStateException,可能我的设置有问题?

1 个答案:

答案 0 :(得分:2)

我认为你得到了IllegalStateException,因为你在setup方法中调用了cleanDb。

您可能不需要清理数据库。由于你的测试是maTrared @Transactional,你在测试中所做的任何事情都会在测试结束时回滚。

看起来事务正在尝试回滚,但找不到它期望的关系。