Один ко многим Джсон отозваться с Джексоном не работает - PullRequest
0 голосов
/ 19 сентября 2018

У меня проблема с использованием JPA и RelationsShips One to Many с Джексоном и Spring Rest ... Я пытаюсь найти несколько решений, но у меня все работает, и я не знаю, в чем проблема.

Например, у меня есть таблица Team, которая имеет отношение один ко многим / много ко одному

У меня есть два хранилища, одно для команды и другое для игрока

Team  >>> has Many >> Player
Player >>> many to one >> Team

Моя сущность Команда имеетследующее содержание

@Entity
@Table(name = "teams")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Team {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private long teamId;

    private String abbreviation;

    private String team;

    private String simpleName;

    private String logo;

    @OneToMany(cascade = {CascadeType.ALL,CascadeType.PERSIST,CascadeType.MERGE}, mappedBy = "team")
    @Column(nullable = false)
    private List<Player> players;

    Theirs getters/setter , hashcodes and string similars.

С другой стороны, сущность Player

    @Entity
@Table(name = "player")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Player {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "teams_id", nullable=true)
    private Team team;

    private String name;

Итак, у меня есть типичный вызов get в контроллере в хранилище.

@RestController
@RequestMapping("/api/public/team")
public class TeamController {

    @Autowired
    private TeamRepository teamRepository;

    @Autowired
    private GenericMethods genericMethods;

    @GetMapping(value = "/{id}")
    public Team getPersona(@PathVariable("id") int id) {
        return teamRepository.findOne(genericMethods.toLong(id));
    }

И хранилище

@Repository
public interface TeamRepository extends JpaRepository<Team, Long> {

}

Теперь, когда я вызываю эту конечную точку, я получаю следующий ответ и считаю, что это неверно, мне нужен только Список с игроками

{  
   "id":2,
   "teamId":0,
   "abbreviation":null,
   "team":null,
   "simpleName":"Betis",
   "logo":null,
   "players":[  
      {  
         "id":1,
         "team":2,
         "category":{  
            "id":1,
            "nombre":"juvenil a",
            "language":null,
            "description":null,
            "league":[  

            ],
            "players":[  
               1,
               {  
                  "id":2,
                  "team":2,
                  "category":1,
                  "name":"hulio"
               }
            ]
         },
         "name":"pepe"
      },
      2
   ]
}

Мне нужноДоступ к информации с Player и Team, поэтому я не могу использовать @ JsonIgnoreProperties

Может ли кто-нибудь помочь решить эту проблему?

1 Ответ

0 голосов
/ 19 сентября 2018

В зависимости от того, чего вы действительно хотите достичь, вы можете попробовать разные варианты.Я не уверен, используете ли вы (или собираетесь использовать) spring-data-rest или нет.

1.Выделенный репозиторий

Остальные данные Spring будут встраивать связанные объекты, если у них нет собственного репозитория.Попробуйте создать public interface PlayersRepository extends JpaRepository...

2.Ленивая загрузка

Почему вы используете FetchType.EAGER?Попробуйте без него.

3.Проекции

Проекции применимы только к спискам, а не к отдельным объектам (то есть не совсем то, что вы просите).Вы можете скрыть игроков из коллекции «Команды», даже если она была возвращена по умолчанию следующим образом:

@Projection(name = "noPlayers", types = { Team.class })
public interface TeamWithoutPlayers {

    Long getId();
    long getTeamId();
    String getAbbreviation();
    String getTeam();
    String getSimpleName();
    String getLogo();
}

Дополнительная информация - проекции остатков данных Spring

4,Игнорировать во время сериализации в Team Сущность, используя @JsonIgnore

@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "teams_id", nullable=true)
private Team team;

Окончательная мысль

С помощью подпружиненного упора данных вы можете расширить CrudRepository вместо JpaRepository и доступ к элементу напрямую через репозиторий.Таким образом, вам не нужно писать контроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...