我有一个 JPA 实体Person和一个实体Team。两者都由一个实体连接人与团队。该连接实体与以下对象保持多对一关系Person和一到Team。它有一个由 id 组成的多列键Person和Team,由 @EmbeddedId 表示。为了将嵌入的 id 来回转换为请求 id,我有一个转换器。这一切都遵循以下建议Spring Data REST @Idclass 无法识别
代码如下所示:
@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 中处理多对多关联的正确方法是什么?
遇到同样的问题后,我找到了解决方案。你的代码应该没问题,除非我返回new PersonToTeamId()
而不是DefaultIdConverter
if id
is null
in fromRequestId()
.
假设您在发布请求中使用 JSON,则必须换行personId
and teamId
in an id
object:
{
"id": {
"personId": "foo",
"teamId": "bar"
},
...
}
并且在某些情况下@EmbeddedId
不是简单的数据类型,而是外键:
{
"id": {
"stringId": "foo",
"foreignKeyId": "http://localhost:8080/path/to/other/resource/1"
},
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)