【问题标题】:Customizing Spring Data Rest @ManyToMany relationship handling自定义 Spring Data Rest @ManyToMany 关系处理
【发布时间】:2016-08-20 17:29:18
【问题描述】:

我有一个运行 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;

    ...

}

现在,显然每个组都可以有 Persons 作为成员,这可以通过 @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;

        ...

}

这不会那么糟糕,但不幸的是会导致问题...我不能再简单地将成员添加到组中,通过 POSTing 和 text/uri-list 到(例如)/groups/1/members,但我有而是通过发布到 /groupMembers/ 创建一个新的 GroupMember 实体,恕我直言,不再那么舒服,并且破坏了 Group REST“树”的凝聚力。

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

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

【问题讨论】:

  • spring-data-rest应该有一个选项可以让你指定join table对象,然后让uri结构减少,只要你指定每个join table附加列减少的方式。跨度>

标签: java spring hibernate spring-data-jpa spring-data-rest


【解决方案1】:

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

@RequestBody Resources<Object> incoming

通过调用incoming.getLinks()获取uris

可以参考spring data rest控制器——org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController#createPropertyReference

【讨论】:

  • 谢谢,这很有帮助。我还找到了一种使用 UriToEntityConverter 的方法,因此现在我可以覆盖我的 POST/PUT 行为以接受到人员的链接并自动为他们创建 GroupMember 实体。
【解决方案2】:

我认为你是对的,最好有第三个实体,GroupMember,就像你提议的那样。难道你还不能公开一个 API 端点,让你发布到/groups/1/members 吗?要做到这一点,您似乎需要在控制器中有业务逻辑来解析适当的 Person(s) 并构造 GroupMember 实例。在我看来,这似乎是该业务逻辑驻留的合适位置。

【讨论】:

  • 正如我所说,我希望有一种简单的方法将 Persons 发布到成员列表中,然后自动创建 GroupMembers。不幸的是,我自己的 BasePathAwareController 似乎甚至无法处理 text/uri-list Content-Types(导致 415),所以我什至无法模拟它,但必须创建一个 json 表示,这会破坏流程(因为它会不同于其他集合的处理)。
猜你喜欢
  • 2017-10-16
  • 2017-11-28
  • 2021-09-06
  • 2018-04-18
  • 2013-07-02
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多