繁体   English   中英

自定义Spring Data Rest @ManyToMany关系处理

[英]Customizing Spring Data Rest @ManyToMany relationship handling

我有一个运行Spring-Data-Rest的简单项目,通过Rest API公开一些实体,比如这个(简化,减去Setters / Getters):

@Entity 
public class Group {

    @Id
    @GeneratedValue
    private int id;

    ...

}

@Entity 
public class Person{

    @Id
    @GeneratedValue
    private int id;

    ...

}

现在,显然每个小组都可以拥有人员作为成员,这可以通过@ManyToMany轻松解决。 不幸的是(或者通常是?)组成员资格包含的信息不仅仅是“是成员”。 例如,它还应包括“是管理员”或“是隐藏成员”的信息。

这自然导致了一个额外的实体......

@Entity 
public class GroupMember {

    @OneToOne(optional = false)
    @JoinColumn(updatable = false)
    private Person member;

    @OneToOne(optional = false)
    @JoinColumn(updatable = false)
    private Group group;

    private boolean admin;

    private boolean hidden;

        ...

}

这不会是坏的,但不幸的是导致了问题...我不能再简单地通过添加成员到组POST荷兰国际集团的text/uri-list来(例如) /groups/1/members ,但我有而是通过发布到/groupMembers/来创建一个新的GroupMember实体,这是imho,不再那么舒服,并打破了群组REST'树'的凝聚力。

如何解决这个问题并允许简单的POST创建一个(基本的)GroupMember,默认值为? 当然我可以在那里放一个新的@RepositoryRestController来捕获/groups/1/members任何POST请求,但这会阻止text / uri-list列表(因为它似乎不支持)。 我可以定义一个新对象,例如使用人员ID,但这会破坏流程,简单发布链接列表会更好。

另一种方法是找到一种方法来映射Hibernate @ManyToMany本身而不需要额外的实体......但我不知道这样的方式......

如果您正在处理spring数据休息并希望在自定义控制器中处理text/uri-list ,则可以使用类型为Resources的参数传递值,如下所示:

@RequestBody Resources<Object> incoming

你通过调用incoming.getLinks()获得uris

您可以将spring数据rest org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController#createPropertyReference作为参考 - org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController#createPropertyReference

我认为你最好有一个第三个实体,就像你提出的GroupMember 你还不能公开一个允许你发布到/groups/1/members的API端点吗? 为了做到这一点,您似乎需要在控制器中使用业务逻辑来解析相应的Person并构造GroupMember实例。 在我看来,这是适合这种业务逻辑的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM