gpt4 book ai didi

java - Hibernate ElementCollection/JoinTable IntegrityConstraintViolationException

转载 作者:行者123 更新时间:2023-12-01 18:59:06 26 4
gpt4 key购买 nike

我有 3 个这样的 JPA 实体以及相应的 JPA 存储库。

@Entity
public class ChairEntity {
...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "chair_image")
private Set<ImageEntity> images = new HashSet<>();
...
}

@Entity
public class TableEntity {
...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "table_image")
private Set<ImageEntity> images = new HashSet<>();
...
}


@Entity
public class ImageEntity{
...
private String description;
@Lob
private byte[] data;
...
}

使用 REST-API 创建和更新这些对象。这通常工作得很好,例如我可以像这样一次添加多个 imageEntities (所有代码块都在它们自己的事务中)

chairEntity.getImages().add(new ImageEntity(..));
chairEntity.getImages().add(new ImageEntity(..));
chairRepository.save(chairEntity);

...或一次更新同一个 chairEntity 的多个 ImageEntities。

chairEntity.getImages().stream().forEach(imageEntity -> {
imageEntity.setDescription("some other description");
}
chairRepository.save(chairEntity);

在这两种情况下,所有更改都会成功级联并保存。

但是,如果我更新现有的 ImageEntity 并添加另一个实体,则会失败:

chairEntity.getImages().stream().forEach(imageEntity -> {
imageEntity.setDescription("some other description");
}
chairEntity.getImages().add(new ImageEntity(...));
chairRepository.save(chairEntity); // crashes

异常如下(使用 h2db 会引发等效错误):

org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "chair_image_pkey"

在检查 DB-Log 时,Hibernate 似乎正在尝试:

  1. 插入新图像(成功)
  2. 更新现有镜像(成功)
  3. 将条目插入到连接表/集合表 (chair_image) 中,引用椅子和现有图像。然后抛出这个 JdbcSQLIntegrityConstraintViolationException,因为这个外键组合已经存在(旧镜像之前已经存在)。

为什么会发生这种情况以及如何解决?在同一事务中单独保存和刷新更改似乎也不起作用。

最佳答案

解决方法,以防其他人遇到此问题:反转操作顺序:

chairEntity.getImages().add(new ImageEntity(...));
chairRepository.saveAndFlush(chairEntity);
chairEntity.getImages().stream().forEach(imageEntity -> {
imageEntity.setDescription("some other description");
}
chairRepository.save(chairEntity); // crashes

hibernate执行SQL语句的顺序保持不变,但由于之间的刷新,错误插入到Join表中的情况不再发生。

关于java - Hibernate ElementCollection/JoinTable IntegrityConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59652322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com