【发布时间】: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