Связи в JSON с родителем не связаны на один уровень вверх, возможно, из-за двух ключей - PullRequest
0 голосов
/ 24 мая 2018

У меня есть класс "Кино" и класс "Актер".Я отобразил их в сущностях как OneToMany и наоборот (в одном фильме может быть много актеров).Crnk создает конечные точки, и они прекрасно работают, кроме ссылки в разделе «отношения» на «Актере», создающей URL-адрес, который находится под конечной точкой «Актера», когда он действительно должен вернуться к корневому URL фильма.

Так под актерами findAll relationships.movie.links.related должно быть:
"related": "/api/v1/movies/1"
вместо
"related": "/api/v1/actors/156/movie"
и аналогично для self

Movie 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;
}

Вы также заметите, что у фильма есть два идентификатора, у него есть основной первичный ключ с использованием столбца MID, но в качестве внешнего ключа используется столбец ID, который также является уникальным идентификатором.К сожалению, это настройка базы данных, которую нельзя изменить.Кроме того, насколько я могу судить, использование referencedColumnName должно обойти эту проблему.

Если у кого-то есть какие-либо предложения о том, почему это может не работать в его текущем состоянии, это будет очень признательно
Спасибо!

ps Я изменил имена классов по причинам паранойи, на случай, если я что-то пропустил, и переменная где-то не совсем совпадает

1 Ответ

0 голосов
/ 25 мая 2018

До сих пор атрибут аннотации referencedColumnName не поддерживается.Но было бы разумно представить поддержку в реализации JpaRelationshipRepository.В настоящее время он основан исключительно на первичном ключе.

...