2016-04-26 49 views
4

我有运行Spring的数据休息通过REST API来揭露一些实体,像这样的(简化,减去塞特斯/吸气剂)一个简单的项目:定制春数据休息@ManyToMany关系处理

@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 ING成员添加到组一个text/uri-list(例如)/groups/1/members,但我不得不创建一个新的GroupMember实体,发布到/groupMembers/,这是imho,不再舒服,并打破了组REST'树'的凝聚力。

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

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

+0

弹簧数据剩下的应该有一个选项,允许您指定连接表的对象,但随后乐只要您指定每个连接表的附加列减少的方式,uri结构就会减少。 – kenny

回答

1

如果你与春天的数据剩下的工作,并希望在自定义控制器来处理text/uri-list你可以通过使用Resources类型的参数是这样的值:通过调用incoming.getLinks()

@RequestBody Resources<Object> incoming 

你得到的URI

你可以看一下春天其余数据控制器作为参考 - org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController#createPropertyReference

+1

谢谢,这非常有帮助。我还找到了一种使用UriToEntityConverter的方法,现在我可以重写我的POST/PUT行为来接受指向人员的链接并自动为它们创建GroupMember实体。 –

0

我认为你是正确的,那根据您的建议,最好有第三个实体GroupMember。你不能仍然公开一个API端点,可以发布到/groups/1/members吗?为了做到这一点,您似乎需要在控制器中拥有业务逻辑来解析合适的Person并构造GroupMember实例。这对我来说似乎是这个商业逻辑所在的适当位置。

+0

正如我所说,我宁愿只是简单地将人员张贴到成员列表中,然后自动创建GroupMembers。不幸的是,我自己的BasePathAwareController似乎无法处理text/uri-list Content-Types(结果为415),所以我甚至不能模拟它,但必须创建一个json表示形式,这会破坏流(因为它与其他收藏的处理不同)。 –