java - CascadeType.PERSIST 无法正确保存

标签 java hibernate spring-boot spring-data-jpa

我认为我在某个地方犯了错误:
有 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. 如果我尝试将 PlayerTeam 一起保存 - 没问题。字段 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/

相关文章:

java - Spring Boot 接口(interface)存储库

java - 在 Spring Boot 中为 Undertow 启用 HTTP 2.0

java - Hibernate中的操作流程是怎样的?

java - Struts2-Full-Hibernate 插件是集成 Struts2 和 Hibernate 的标准方式吗?

java - 为什么我的类(class)没有加载

java - 在 gin 中绑定(bind)生成的类

java - Spring+hibernate java.lang.StackOverflowError

java - 无法在 Spring Boot 应用程序中从 data.sql 导入 sql 插入脚本数据

java - 如何使用 spring 框架检查启动和停止?

java - 同步以确保对不可变对象(immutable对象)的引用将被另一个线程看到