首页 > 解决方案 > CascadeType.PERSIST 无法正确保存

问题描述

我假设我在某处犯了一个错误:
有 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用 a 保存 a Team- 没关系。字段team_id将被填充,然后当我获取它时会找到与该玩家相关的团队。
2.如果我尝试用一Team​​些新的来保存Players- 它正在保存,但Players将在 db 内null的字段中。team_id如果我尝试获取 - 我将得到一个空数组。
3. 如果我从表中删除mappedByTeam我将得到新TEAM_PLAYERS表并且获取将正常工作(我认为这是错误的;team_id将保留null)。

我错过了什么?

标签: javahibernatespring-bootspring-data-jpa

解决方案


您已将您的 Team 映射到 Player 类中的“team_id”,但您的 @Id 属性是“id”。将其更改为:

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

至:

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

推荐阅读