我认为我在某个地方犯了错误:
有 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'}]}]
我正在使用 spring-boot 最新版 (2.1.2.RELEASE) 和 H2 (1.4.197)。
我的问题是当我保存时:
1. 如果我尝试将 Player
与 Team
一起保存 - 没问题。字段 team_id
将被填充,然后当我获取它时会找到与该玩家相关的团队。
2. 如果我尝试用一些新的 Players
保存一个 Team
- 它正在保存,但 Players
在 db 内的 team_id
字段中将具有 null
。如果我尝试获取 - 我将得到一个空数组。
3. 如果我从 Team
中删除 mappedBy
,我将获得新的 TEAM_PLAYERS
表,并且提取将正确工作(我认为这是错误的;team_id
将保留 null
)。
我错过了什么?
最佳答案
您的团队已映射到您的 Player 类中的“team_id”,但您的 @Id 属性是“id”。将其更改为:
@JoinColumn(name = "team_id", referencedColumnName = "team_id")
private Team team;
致:
@JoinColumn(name = "id", referencedColumnName = "id")
private Team team;
关于java - CascadeType.PERSIST 无法正确保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54382334/