java - 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. 如果我从表中删除mappedBy
,Team
我将得到新TEAM_PLAYERS
表并且获取将正常工作(我认为这是错误的;team_id
将保留null
)。
我错过了什么?
解决方案
您已将您的 Team 映射到 Player 类中的“team_id”,但您的 @Id 属性是“id”。将其更改为:
@JoinColumn(name = "team_id", referencedColumnName = "team_id")
private Team team;
至:
@JoinColumn(name = "id", referencedColumnName = "id")
private Team team;
推荐阅读
- php - 使用 FILTER_SANITIZE_FULL_SPECIAL_CHARS 后使用 & 验证 RTF 输入
- c++ - 递归幂函数健全性检查
- python - Conda env 和 python 包
- c# - 在假的(FakeItEasy 库)上设置属性值似乎不起作用
- regex - 正则表达式从调用函数时使用的源代码中提取所有字符串
- vba - 计算记录比较的唯一标识符
- python - NEST 模拟器:python 说“ModuleNotFoundError: No module named 'nest'”
- javascript - 用新行分割,但如果它被引号括起来则跳过
- python - 确保引用列与 ForeignKey 或 ForeignKeyConstraint 相关联,或指定“primaryjoin”表达式
- c# - 将其 .itemssource 设置为列表但在我将项目添加到列表时不更新的 ListView