当前位置: 首页 > 知识库问答 >
问题:

Spring数据Neo4j多态关联出现嵌入式

高森
2023-03-14

我在通过REST向子类型暴露关系时遇到了问题。我有一个抽象类,名为Page:

@NodeEntity
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "category", visible = true)
@JsonSubTypes({ @Type(value = Musician.class), @Type(value = Book.class),
        @Type(value = Song.class) })
public abstract class Page extends BaseEntity{

    @Fetch
    @CreatedBy
    private User creator;

    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @GraphProperty(propertyType = Long.class)
    @CreatedDate private LocalDateTime timeCreated;

    @NotEmpty
    @Size(min = 1, max = 160)
    @Indexed(indexType = IndexType.FULLTEXT, indexName = "search")
    private String screenname;

    @Fetch
    @RelatedTo(type = "CHANNEL")
    private Channel channel = new Channel();

    public Channel getChannel() {
        return channel;
    }

    public void setChannel(Channel channel) {
        this.channel = channel;
    }

    public String getScreenname() {
        return screenname;
    }

    public void setScreenname(String screenname) {
        this.screenname = screenname;
    }

    // This is to work around the bug where type name is not exported by SDR.
    @JsonGetter(value = "category")
    public String getType() {
        return this.getClass().getSimpleName();
    }

    public User getCreator() {
        return creator;
    }

    public void setCreator(User creator) {
        this.creator = creator;
    }

    public LocalDateTime getTimeCreated() {
        return timeCreated;
    }

    public void setTimeCreated(LocalDateTime timeCreated) {
        this.timeCreated = timeCreated;
    }

}
@NodeEntity
@JsonTypeName("Song")
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="category", visible=true)
public class Song extends Page {

    @Fetch
    @RelatedTo(type = "SINGER")
    private Musician singer;

    public Musician getSinger() {
        return singer;
    }

    public void setSinger(Musician singer) {
        this.singer = singer;
    }

}
@NodeEntity
@JsonTypeName("Musician")
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="category", visible=true)
public final class Musician extends Page {

}
@RepositoryRestResource(collectionResourceRel = "pages", path = "pages")
public interface PageRepository extends PagingAndSortingRepository<Page, Long> {

    org.springframework.data.domain.Page<Musician> findMusicianByScreennameLike(@Param("0") String screenname, Pageable page);

}

当我从api获得一个Song实例时,json看起来如下所示:

{
  "uuid" : "ee9daf8b-4285-45bb-a583-e37f54284c43",
  "timeCreated" : null,
  "screenname" : "songtest",
  "singer" : null,
  "id" : 213,
  "category" : "Song",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/api/pages/213"
    },
    "channel" : {
      "href" : "http://localhost:8080/api/pages/213/channel"
    },
    "creator" : {
      "href" : "http://localhost:8080/api/pages/213/creator"
    }
  }
}

问题是singer字段似乎是嵌入式的。我不能把一个现有的音乐家和这个歌手领域联系在一起。当我试图将现有音乐家的uri分配到singer字段时,它抱怨说它不能从String转换为Music。如果我提供json而不是uri,那么它将创建一个具有相同字段值的新Musian。因此,当从实体引用子类型Musician时,它被视为不由它的超类型的存储库管理。如何使singer像链接部分下的其他相关顶级资源一样导出,并通过接受URI为其分配现有资源?还是根本不可能?

共有1个答案

计光赫
2023-03-14

我相信您需要为Musician、Book和Song为Spring Data Rest建立单独的存储库,以便正确地确定实体之间的关系。一旦解决了这个问题,它就应该像您所期望的那样--返回嵌入式实体的链接而不是JSON,并在发布嵌入式实体时接受URI。

您可能想看看这个答案,了解如何在存储库定义中处理继承:

https://stackoverflow.com/a/27549198/4601679

 类似资料:
  • 我正在构建一个将使用neo4j的web应用程序。我将在Java构建一个REST API,它将使用Neo4j嵌入式版本。这个架构有什么问题吗? 用别的方法好吗?Neo4j服务器? 谢谢!

  • 我在我的脚手架上工作,我似乎无法让尼奥嵌入初始化。我使用Neo 2,所以我运行Spring数据3.0.0. m1。我不能让它亮起来。这是我的背景 但我有个例外 我找不到任何地方说有更多的构造函数参数。 这是我的依赖项

  • 我在我的web应用程序中使用了Spring Boot1.5.7、Spring Data REST、Spring JPA、Hibernate、Spring HATEOAS、Spring Validation和Swagge。这个应用程序提供RESTendpoint,这些endpoint将由Angular客户机使用。 在我的模型中,许多实体都有一个列表。用户、车票、退票等有一个。根据我在网上找到的一些文

  • 我终于能够在我的java应用程序中创建一个服务器实例,使用嵌入式数据库,如下所述。当我在Eclipse上运行它时,它可以正常工作,但这实际上不是我的目的(我的应用程序在其他事情之间,为数据库提供新的节点和关系)。我有一个Neo4j盒子,它应该是我的服务器实例,我想把我的应用程序作为JAR文件部署在那里。这样,我想从那里访问web界面。我已经对它进行了测试:在我的开发机器上运行java应用程序时,同

  • 多态一对多关联 多态关联允许一个模型在单个关联定义方法中从属一个以上其它模型,例如用户可以评论书和文章,但评论表通常都是同一个数据表的设计。多态一对多关联关系,就是为了满足类似的使用场景而设计。 下面是关联表的数据表结构: article id - integer title - string content - text book id - integer

  • 使用1.8。2--尝试(最初)设置2节点HA群集。 以下部分“22.5.4。启动Neo4j嵌入HA模式"的 http://docs.neo4j.org/chunked/stable/ha-setup-tutorial.html 我已将以下内容添加到我的pom中。xml: 并将我的application-content.xml修改如下: 和 /etc/白兔。属性包含: 节点1(地址:192.168.