【问题标题】:Micronaut Data's cascade persist doesn't save child objectsMicronaut Data 的级联持久化不保存子对象
【发布时间】:2019-12-06 16:34:21
【问题描述】:

保存创建新子对象的拥有实体对象后,发生了一件奇怪的事情。仅保存拥有对象,但 SQL 日志也显示子实体的插入。

团队

@Data
@EqualsAndHashCode(of = "id")
@NoArgsConstructor
@Entity
public class Team implements Comparable<Team> {
    @Id
    @GeneratedValue
    private int id;
    private String name;
    @Relation(value = Relation.Kind.ONE_TO_MANY, cascade = Relation.Cascade.PERSIST, mappedBy = "team")
    private List<TeamPlayer> teamPlayers;
    private int givenGoals;
    private int gotGoals;
    private int points;
    @Relation(value = Relation.Kind.MANY_TO_ONE)
    private Tournament tournament;
}

团队玩家

@Data
@EqualsAndHashCode(of = "id")
@NoArgsConstructor
@Entity
public class TeamPlayer {
    @Id
    @GeneratedValue
    private int id;
    @Relation(value = Relation.Kind.MANY_TO_ONE)
    private Team team;
    @Relation(Relation.Kind.MANY_TO_ONE)
    private Player player;
}

播放器

@Data
@EqualsAndHashCode(of = "id")
@NoArgsConstructor
@Entity
public class Player {
    @Id
    @GeneratedValue
    private int id;
    private String forename;
    private String surname;
    private int rank;
    @Relation(value = Relation.Kind.ONE_TO_ONE, cascade = Relation.Cascade.ALL)
    private User user;
}

团队存储库

@JdbcRepository
public interface TeamRepository extends CrudRepository<Team, Integer> {}

保存集合后 teamRepository.saveAll(teams) 输出是...

17:16:32.160 [pool-1-thread-11] DEBUG io.micronaut.data.query - Executing Batch SQL Insert: INSERT INTO "team" ("name","given_goals","got_goals","points","tournament_id") VALUES (?,?,?,?,?)
17:16:33.308 [pool-1-thread-11] DEBUG io.micronaut.data.query - Executing Batch SQL Insert: INSERT INTO "team_player" ("team_id","player_id") VALUES (?,?)
17:16:33.308 [pool-1-thread-11] DEBUG io.micronaut.data.query - Executing Batch SQL Insert: INSERT INTO "team_player" ("team_id","player_id") VALUES (?,?)
17:16:33.309 [pool-1-thread-11] DEBUG io.micronaut.data.query - Executing Batch SQL Insert: INSERT INTO "team_player" ("team_id","player_id") VALUES (?,?)
17:16:33.309 [pool-1-thread-11] DEBUG io.micronaut.data.query - Executing Batch SQL Insert: INSERT INTO "team_player" ("team_id","player_id") VALUES (?,?)
17:16:33.309 [pool-1-thread-11] DEBUG io.micronaut.data.query - Executing Batch SQL Insert: INSERT INTO "team_player" ("team_id","player_id") VALUES (?,?)
17:16:33.310 [pool-1-thread-11] DEBUG io.micronaut.data.query - Executing Batch SQL Insert: INSERT INTO "team_player" ("team_id","player_id") VALUES (?,?)

但是,数据库中只创建了团队,并且没有显示进一步的错误。

有人可以帮我解决这个问题吗?

编辑: 将日志记录更改为跟踪级别后,我可以看到 table team_player 的批处理选择的值未绑定..

14:31:40.928 [pool-1-thread-4] DEBUG io.micronaut.data.query - Executing SQL Insert: INSERT INTO "team" ("name","given_goals","got_goals","points","tournament_id") VALUES (?,?,?,?,?)
14:31:40.928 [pool-1-thread-4] TRACE io.micronaut.data.query - Binding value Team1 to parameter at position: 1
14:31:40.928 [pool-1-thread-4] TRACE io.micronaut.data.query - Binding value 0 to parameter at position: 2
14:31:40.928 [pool-1-thread-4] TRACE io.micronaut.data.query - Binding value 0 to parameter at position: 3
14:31:40.928 [pool-1-thread-4] TRACE io.micronaut.data.query - Binding value 0 to parameter at position: 4
14:31:40.928 [pool-1-thread-4] TRACE io.micronaut.data.query - Binding value 2 to parameter at position: 5
14:31:40.959 [pool-1-thread-4] DEBUG io.micronaut.data.query - Executing Batch SQL Insert: INSERT INTO "team_player" ("team_id","player_id") VALUES (?,?)
14:31:40.991 [pool-1-thread-4] DEBUG io.micronaut.data.query - Executing Query: UPDATE "tournament" SET "status"=? WHERE ("id" = ?)
...

【问题讨论】:

  • 您没有显示代码来表明您如何保存实例。
  • 我已经更新了帖子,但是即使使用save() 逐项更改保存时,cmets 也是相同的。注意:我正在使用 CrudRepository 中的默认方法 save 和 saveAll
  • 关于日志记录的注意事项。如果为 io.micronaut.data 打开 TRACE 级别的日志记录,您将获得 SQL 中使用的值。我注意到 Batch SQL Insert 的 DEBUG 消息并没有告诉您插入了多少条记录。即使没有要插入的记录,也会记录 DEBUG 消息。 TRACE 级别将显示插入的每一行(如果有)的值。基于 1.0.0.M5 的发行说明,它支持插入(保存)时的级联。也许它在 update() 上还不支持它?
  • 感谢您的提示,我不知道如何在 micronaut 中显示绑定值。说到级联更新,目前还不支持,但是有什么关系呢?

标签: postgresql micronaut micronaut-data


【解决方案1】:

此问题的原因是 ID 被定义为原语而不是对象整数。更改为private Integer id; 后,它可以工作了。

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 2022-11-28
    • 2017-04-03
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2021-11-10
    相关资源
    最近更新 更多