spring-data-neo4j:无法创建具有相同标签的两个关系属性 [英] spring-data-neo4j: Can't create two relationship properties with same label

查看:128
本文介绍了spring-data-neo4j:无法创建具有相同标签的两个关系属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用spring-data-neo4j,我无法在具有相同标签的同一类中设置两个关系属性.

Using spring-data-neo4j, I am not able to set up two relationship properties in the same class with the same label.

以下代码可在我的分支机构中找到 https ://github.com/spencerhrob/gs-accessing-data-neo4j/tree/same-name-relationships .

The following code can be found in my branch https://github.com/spencerhrob/gs-accessing-data-neo4j/tree/same-name-relationships.

Person.java:

Person.java:

@NodeEntity
public class Person {

    @GraphId Long id;
    public String name;

    public Person() {}
    public Person(String name) { this.name = name; }

    @RelatedTo(type="MEMBER_OF", direction=Direction.OUTGOING)
    Dojo dojo;

    @RelatedTo(type="MEMBER_OF", direction=Direction.OUTGOING)
    MailingList mailingList;

    public void setDojo(Dojo dojo) {
        this.dojo = dojo;
    }
    public void setMailingList(MailingList mailingList) {
        this.mailingList = mailingList;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + "]";
    }
}

Dojo.java:

Dojo.java:

@NodeEntity
public class Dojo {

    @GraphId Long id;
    public String name;

    public Dojo() { }
    public Dojo(String name) { this.name = name; }

    @Override
    public String toString() {
        return "Dojo [name=" + name + "]";
    }
}

MailingList.java:

MailingList.java:

@NodeEntity
public class MailingList {

    @GraphId Long id;
    public String name;

    public MailingList() { }
    public MailingList(String name) { this.name = name; }

    @Override
    public String toString() {
        return "MailingList [name=" + name + "]";
    }

}

Application.java:

Application.java:

@Configuration
@EnableNeo4jRepositories(basePackages = "hello")
public class Application extends Neo4jConfiguration implements CommandLineRunner {

    public Application() {
        setBasePackage("hello");
    }

    @Bean
    GraphDatabaseService graphDatabaseService() {
        return new GraphDatabaseFactory().newEmbeddedDatabase("accessingdataneo4j.db");
    }

    @Autowired
    PersonRepository personRepository;

    @Autowired
    GraphDatabase graphDatabase;

    public void run(String... args) throws Exception {
        Transaction tx = graphDatabase.beginTx();
        try {
            Person linus = new Person("Linus");
            linus.setDojo(new Dojo("Coding Dojo"));
            linus.setMailingList(new MailingList("Kernel Mailing List"));

            personRepository.save(linus);

            tx.success();
        } finally {
            tx.close();
        }
    }

    public static void main(String[] args) throws Exception {
        FileUtils.deleteRecursively(new File("accessingdataneo4j.db"));

        SpringApplication.run(Application.class, args);
    }
}

运行此代码时,出现以下异常:

When I run this code, I get the following exception:

java.lang.IllegalStateException:无法执行CommandLineRunner 在 org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:680) 在 org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:695) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:321) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:952) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:941) 在hello.Application.main(Application.java:56)造成原因: org.springframework.data.mapping.model.MappingException:设置 属性mailingList上位于[人=名字]上的人[名字=空]的Dojo [名字=空] org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.setProperty(SourceStateTransmitter.java:85) 在 org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyEntityStatePropertyValue(SourceStateTransmitter.java:91) 在 org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.access $ 000(SourceStateTransmitter.java:40) 在 org.springframework.data.neo4j.support.mapping.SourceStateTransmitter $ 2.doWithAssociation(SourceStateTransmitter.java:61) 在 org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:324) 在 org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyPropertiesFrom(SourceStateTransmitter.java:57) 在 org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.loadEntity(Neo4jEntityConverterImpl.java:112) 在 org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.read(Neo4jEntityConverterImpl.java:104) 在 org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister $ CachedConverter.read(Neo4jEntityPersister.java:170) 在 org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.createEntityFromState(Neo4jEntityPersister.java:189) 在 org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.persist(Neo4jEntityPersister.java:244) 在 org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.persist(Neo4jEntityPersister.java:231) 在 org.springframework.data.neo4j.support.Neo4jTemplate.save(Neo4jTemplate.java:356) 在 org.springframework.data.neo4j.support.Neo4jTemplate.save(Neo4jTemplate.java:350) 在 org.springframework.data.neo4j.repository.AbstractGraphRepository.save(AbstractGraphRepository.java:91) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:606)在 org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:405) 在 org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:390) 在 org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:344) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation(TransactionInterceptor.java:98) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 在com.sun.proxy.$ Proxy43.save(未知来源)处 hello.Application.run(Application.java:44)在 org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:677) ...省略了5个共同的框架 org.springframework.core.convert.ConverterNotFoundException:否 发现可以从hello.Dojo类型转换为类型的转换器 hello.MailingList位于 org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:291) 在 org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:177) 在 org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:158) 在 org.springframework.data.mapping.model.BeanWrapper.getPotentiallyConvertedValue(BeanWrapper.java:155) 在 org.springframework.data.mapping.model.BeanWrapper.setProperty(BeanWrapper.java:75) 在 org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.setProperty(SourceStateTransmitter.java:83) ...省略了37个共同的框架

java.lang.IllegalStateException: Failed to execute CommandLineRunner at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:680) at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:695) at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) at org.springframework.boot.SpringApplication.run(SpringApplication.java:952) at org.springframework.boot.SpringApplication.run(SpringApplication.java:941) at hello.Application.main(Application.java:56) Caused by: org.springframework.data.mapping.model.MappingException: Setting property mailingList to Dojo [name=null] on Person [name=Linus] at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.setProperty(SourceStateTransmitter.java:85) at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyEntityStatePropertyValue(SourceStateTransmitter.java:91) at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.access$000(SourceStateTransmitter.java:40) at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter$2.doWithAssociation(SourceStateTransmitter.java:61) at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:324) at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyPropertiesFrom(SourceStateTransmitter.java:57) at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.loadEntity(Neo4jEntityConverterImpl.java:112) at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.read(Neo4jEntityConverterImpl.java:104) at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister$CachedConverter.read(Neo4jEntityPersister.java:170) at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.createEntityFromState(Neo4jEntityPersister.java:189) at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.persist(Neo4jEntityPersister.java:244) at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.persist(Neo4jEntityPersister.java:231) at org.springframework.data.neo4j.support.Neo4jTemplate.save(Neo4jTemplate.java:356) at org.springframework.data.neo4j.support.Neo4jTemplate.save(Neo4jTemplate.java:350) at org.springframework.data.neo4j.repository.AbstractGraphRepository.save(AbstractGraphRepository.java:91) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:405) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:390) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) at com.sun.proxy.$Proxy43.save(Unknown Source) at hello.Application.run(Application.java:44) at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:677) ... 5 common frames omitted Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type hello.Dojo to type hello.MailingList at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:291) at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:177) at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:158) at org.springframework.data.mapping.model.BeanWrapper.getPotentiallyConvertedValue(BeanWrapper.java:155) at org.springframework.data.mapping.model.BeanWrapper.setProperty(BeanWrapper.java:75) at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.setProperty(SourceStateTransmitter.java:83) ... 37 common frames omitted

这里有很多东西,但是真正的错误是Spring试图将Dojo转换为MailingList.

There's a lot there but the real error is that Spring is trying to convert a Dojo into a MailingList.

同时,如果我使用不同的名称来命名关系(例如在我的分支 https://github.com/spencerhrob/gs-accessing-data-neo4j/tree/different-name-relationships ). Person.java:

Meanwhile, this code works if I name the relationships with different names (as in my branch https://github.com/spencerhrob/gs-accessing-data-neo4j/tree/different-name-relationships). Person.java:

@NodeEntity
public class Person {

    @GraphId Long id;
    public String name;

    public Person() {}
    public Person(String name) { this.name = name; }

    @RelatedTo(type="MEMBER_OF_DOJO", direction=Direction.OUTGOING)
    Dojo dojo;

    @RelatedTo(type="MEMBER_OF_LIST", direction=Direction.OUTGOING)
    MailingList mailingList;

    public void setDojo(Dojo dojo) {
        this.dojo = dojo;
    }
    public void setMailingList(MailingList mailingList) {
        this.mailingList = mailingList;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + "]";
    }
}

在不对Application.java(或Dojo.java或MailingList.java)进行任何更改的情况下,此代码将成功执行.

Without any changes to Application.java (or to Dojo.java or MailingList.java), this code executes successfully.

从这个例子中我的理解是spring-data-neo4j不允许一个类具有两个带有相同标签的属性.在某些情况下,不同的关系需要具有相同的标签-例如,要符合建模标准.是否可以在spring-data-neo4j中建立多个具有相同名称的关系?如果可以,怎么办?

My understanding from this example is that spring-data-neo4j will not allow a class to have two properties that have the same label. In certain cases different relationships need to have the same label--for example, to conform to modeling standards. Is it possible to set up more than one relationship with the same name in spring-data-neo4j? If so, how?

推荐答案

我已经找到了这个问题的答案.我正在寻找的是"enforceTargetType"属性,其为文档中所述.

I've found the answer to this question. What I was looking for is the "enforceTargetType" attribute as described in the documentation.

我已经建立了使用此修复程序的存储库分支.它位于 https://github.com/spencerhrob/gs-accessing-data-neo4j/tree/same-name-enforce-target .

I've made a branch of the repository that uses this fix. It is found at https://github.com/spencerhrob/gs-accessing-data-neo4j/tree/same-name-enforce-target.

Person.java:

Person.java:

@NodeEntity
public class Person {

    @GraphId Long id;
    public String name;

    public Person() {}
    public Person(String name) { this.name = name; }

    @RelatedTo(type="MEMBER_OF", direction=Direction.OUTGOING, enforceTargetType=true)
    Dojo dojo;

    @RelatedTo(type="MEMBER_OF", direction=Direction.OUTGOING, enforceTargetType=true)
    MailingList mailingList;

    public void setDojo(Dojo dojo) {
        this.dojo = dojo;
    }
    public void setMailingList(MailingList mailingList) {
        this.mailingList = mailingList;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + "]";
    }
}

在没有对存储库进行其他任何更改的情况下,此代码可以正常运行,并且检查创建的Neo4j数据库是否表现出预期的效果.

With no other changes to the repository, this code runs without any errors, and inspecting the created Neo4j database shows that it is behaving as expected.

这篇关于spring-data-neo4j:无法创建具有相同标签的两个关系属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆