【发布时间】:2016-04-13 18:08:27
【问题描述】:
我有一个 JPA 实体 Person 和一个实体 Team。两者都由一个实体PersonToTeam 连接。该加入实体与 Person 和 Team 保持多对一关系。它有一个由 Person 和 Team 的 id 组成的多列键,由 @EmbeddedId 表示。要将嵌入的 id 来回转换为请求 id,我有一个转换器。这一切都遵循Spring Data REST @Idclass not recognized上的建议
代码如下所示:
@Entity
public class PersonToTeam {
@EmbeddedId
@Getter
@Setter
private PersonToTeamId id = new PersonToTeamId();
@ManyToOne
@Getter
@Setter
@JoinColumn(name = "person_id", insertable=false, updatable=false)
private Person person;
@ManyToOne
@Getter
@Setter
@JoinColumn(name = "team_id", insertable=false, updatable=false)
private Team team;
@Getter
@Setter
@Enumerated(EnumType.STRING)
private RoleInTeam role;
public enum RoleInTeam {
ADMIN, MEMBER
}
}
@EqualsAndHashCode
@Embeddable
public class PersonToTeamId implements Serializable {
private static final long serialVersionUID = -8450195271351341722L;
@Getter
@Setter
@Column(name = "person_id")
private String personId;
@Getter
@Setter
@Column(name = "team_id")
private String teamId;
}
@Component
public class PersonToTeamIdConverter implements BackendIdConverter {
@Override
public boolean supports(Class<?> delimiter) {
return delimiter.equals(PersonToTeam.class);
}
@Override
public Serializable fromRequestId(String id, Class<?> entityType) {
if (id != null) {
PersonToTeamId ptid = new PersonToTeamId();
String[] idParts = id.split("-");
ptid.setPersonId(idParts[0]);
ptid.setTeamId(idParts[1]);
return ptid;
}
return BackendIdConverter.DefaultIdConverter.INSTANCE.fromRequestId(id, entityType);
}
@Override
public String toRequestId(Serializable id, Class<?> entityType) {
if (id instanceof PersonToTeamId) {
PersonToTeamId ptid = (PersonToTeamId) id;
return String.format("%s-%s", ptid.getPersonId(), ptid.getTeamId());
}
return BackendIdConverter.DefaultIdConverter.INSTANCE.toRequestId(id, entityType);
}
}
这个转换器的问题是,当一个 post 请求尝试创建一个新的 personToTeam 关联时,fromRequestId 方法将一个 null 作为 id 参数。但是没有关于帖子有效负载的其他信息。那么应该如何创建具有个人和团队外键的 id 呢?作为一个更普遍的问题:在 Spring Data Rest 中处理多对多关联的正确方法是什么?
【问题讨论】:
-
为什么会有private PersonToTeamId id = new PersonToTeamId();,去掉= new PersonToTeamId();部分,看看,这将工作。
-
这不会改变任何事情。问题是当请求发布时,使用空的可序列化 id 调用 Converter。
-
您是否偶然找到了解决方案?我遇到了同样的问题。
标签: spring jpa spring-data-jpa spring-data-rest