我有一个“电影”课和一个“演员”课程。我已将这些实体映射为OneToMany,反之亦然(一个Movie可以有很多Actors)。 Crnk正在创建端点并且它们工作得很好,除了“Actor”上的“关系”下的链接创建了一个位于“Actor”端点下的URL,当它真的应该返回到根电影URL时。
所以在Actors下,findAll relationships.movie.links.related
应该是:
"related": "/api/v1/movies/1"
而不是
"related": "/api/v1/actors/156/movie"
同样适用于self
电影findAll端点
{
"data": [
{
"id": "1",
"type": "v1/movies",
"attributes": {
"name": "I.M.Movie"
},
"relationships": {
"actors": {
"links": {
"self": "/api/v1/movies/1/relationships/actors",
"related": "/api/v1/movies/1/actors"
}
}
},
"links": {
"self": "/api/v1/movies/1"
}
}
],
"meta": {
"totalResourceCount": null
}
}
演员findAll端点
{
"data": [
{
"id": "156",
"type": "v1/actors",
"attributes": {
"name": "I.R.Actor"
},
"relationships": {
"movie": {
"links": {
"self": "/api/v1/actors/156/relationships/movies",
"related": "/api/v1/actors/156/movies"
}
},
},
"links": {
"self": "/api/v1/actors/156"
}
}
],
"meta": {
"totalResourceCount": null
}
}
以下是实体及其关系注释:
MovieEntity
@Entity(name = "movie")
@JsonApiResource(type = "v1/movies")
@Data
public class MovieEntity implements BaseEntity<String> {
@Id
@JsonApiId
@Column(name="MID")
private String id;
@JsonIgnore
@Column(name = "ID")
private String secondId;
private String name;
@OneToMany(mappedBy = "movie", cascade = CascadeType.ALL)
@JsonApiRelation
@JsonManagedReference
private List<ActorEntity> actors;
}
ActorEntity
@Entity(name = "SP")
@JsonApiResource(type = "v1/actors")
@Getter
@Setter
public class ActorEntity implements BaseEntity<String> {
@Id
@JsonApiId
@Column(name = "ID")
private String id;
private String name;
@ManyToOne
@JoinColumn(name = "MOVIEID", referencedColumnName = "ID")
@JsonApiRelation(serialize = SerializeType.LAZY)
@JsonBackReference
private MovieEntity movie;
}
你还会注意到Movie有两个ID,它有使用列MID
的主键,但是用作外键的列是ID
,它也是一个唯一的ID。遗憾的是,这是数据库的设置,无法更改。另外,据我所知,使用referencedColumnName
应该解决这个问题。
如果有人对为什么这可能不适用于当前状态有任何建议,我们将不胜感激 谢谢!
p.s我为了偏执的原因更改了类名,以防万一我错过了某些内容并且某个地方的某个变量没有完全排列
答案 0 :(得分:1)
到目前为止,不支持referencedColumnName注释属性。但是在JpaRelationshipRepository实现中引入支持是可以想象的。目前它是严格的主键。