我有一个简单的项目运行 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;

        ...

}

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

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

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

最佳答案

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

@RequestBody Resources<Object> incoming

您通过调用 incoming.getLinks() 获取 uri

可以引用spring data rest controller - org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController#createPropertyReference

10-07 19:59
查看更多