Как правильно сопоставить отношения @OneToMany и @ManyToOne, чтобы я мог сохранять и обновлять сторону @OneToMany со стороной @ManyToOne или без нее - PullRequest
0 голосов
/ 13 июля 2020

У меня есть приложение с интерфейсом Angular и сервером Spring. Здесь речь идет о двух классах (backend):

@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "tournament_games")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class TournamentGame {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "code", foreignKey = @ForeignKey(name = "code_fk"))
    private TournamentCode code;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "type", foreignKey = @ForeignKey(name = "game_type_fk"))
    private GameType type;

    @Column(name = "home_score")
    private int home_score;

    @Column(name = "away_score")
    private int away_score;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "result_type", foreignKey = @ForeignKey(name = "result_type_fk"))
    private ResultType result_type;

    @Column(name = "status")
    private boolean status;

    @Column(name = "round")
    private int round;

    @Column(name = "locked")
    private boolean locked;

    @OneToMany(mappedBy = "game", fetch = FetchType.EAGER)
    private List<TournamentGamesPlayers> players = new ArrayList<>();
}

и

@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "tournament_games_players")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "game")
public class TournamentGamesPlayers implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @ManyToOne
    @JoinColumn(name = "tournament_game_id")
    private TournamentGame game;

    @Id
    @ManyToOne
    @JoinColumn(name = "playerid")
    private Player player;

    @Column(name = "home")
    private boolean home;
}

Мне нужна помощь в выяснении того, как сохранить List<TournamentGamesPlayers> при сохранении и / или обновлении TournamentGame объект. Я создаю 45 игр. Первые 30 игр были известны игрокам, поэтому я установил их перед сохранением. Последние 15 не имеют записей для таблицы соединения TournamentGamesPlayers, потому что мне нужно добавить их позже.

Я могу получить некоторые результаты с CascadeType.ALL на стороне @OneToMany, когда я изначально генерирую игры, но это не удается, когда я пытаюсь обновить игру с кажущейся бесконечной рекурсией / переполнением стека. не попасть.

Ответы [ 2 ]

0 голосов
/ 23 июля 2020

попробуйте поставить CascadeType.MERGE, CascadeType.ALL «удалить родительский и сиротский» ( JPA CascadeType.ALL не удаляет сирот ).

Кроме того, определяя отношение как EAGER, а не игнорирование свойства JSON может вызвать проблемы. Я бы добавил @JsonIgnore в одну из частей отношения

0 голосов
/ 17 июля 2020

В итоге я просто вернул игроков за игровой стол, чтобы облегчить себе жизнь.

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