CascadeType.PERSIST не сохраняет должным образом - PullRequest
0 голосов
/ 26 января 2019

Я предполагаю, что где-то допустил ошибку:
Есть 2 объекта (удалены все ненужные поля):

1.Игрок (много игроков -> в 1 команде)

@Component
@Entity
@Table(name = "player")
public class Player extends BaseEntity implements Serializable {

@Id
@GeneratedValue
@Column(name = "id")
private Long id;

@Min(0)
@Column(name = "uid")
private Integer uid;

@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
@JoinColumn(name = "team_id", referencedColumnName = "team_id")
private Team team;

2.Команда (одна команда содержит много игроков)

@Component
@Entity
@Table(name = "team")
public class Team extends BaseEntity implements Serializable {

@Id
@GeneratedValue
@Column(name = "id")
private Long id;

@Min(0)
@Column(name = "team_id", unique = true)
private Integer teamId;

@OneToMany(mappedBy = "team", cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
private Set<Player> players;

Отредактировано (тестовые примеры):
1. В этом случае я получу пустой «team_id» и пустоймассив из выборки:

Team team = new Team(100, "Red");
Player p1 = new Player(4, "Aaa");
Player p2 = new Player(5, "Bbb");
team.addPlayer(p1);
team.addPlayer(p2);
store.getTeamStore().save(team);
System.out.println(store.getTeamStore().findAll());
-> [Team{id=1, teamId=100, teamAbbrev='Red', players=[]}]

2.Тот же самый метод + setTeam () перед сохранением:

...
p1.setTeam(team)
p2.setTeam(team)
store.getTeamStore().save(team);
System.out.println(store.getTeamStore().findAll());
-> [Team{id=1, teamId=100, teamAbbrev='Red', players=[Player{id=2, uid=4, name='Aaa'}, Player{id=3, uid=5, name='Bbb'}]}]

Я использую последние версии пружинной загрузки (2.1.2.RELEASE) и H2 (1.4.197).
Моя проблема, когда яСохраняю:
1. Если я пытаюсь сохранить Player с Team - это нормально.Поле team_id будет заполнено, и затем, когда я получу его, он найдет команду, связанную с этим игроком.
2. Если я попытаюсь сохранить Team с каким-то новым Players - он сохраняется, но Players будет иметь null в поле team_id внутри БД.Если я попытаюсь получить - я получу пустой массив.
3. Если я удалю mappedBy из Team, я получу новую таблицу TEAM_PLAYERS, и выборка будет работать правильно (я думаю, что это неправильно; team_id останется null).

Что я пропустил?

1 Ответ

0 голосов
/ 27 января 2019

Ваша команда сопоставлена ​​с "team_id" в вашем классе Player, но ваше свойство @Id равно "id". измените его с:

@JoinColumn(name = "team_id", referencedColumnName = "team_id")
private Team team;

Кому:

@JoinColumn(name = "id", referencedColumnName = "id")
private Team team;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...