【问题标题】:Spring Boot Referential integrity constraint violation only on the server in the pipelineSpring Boot 参照完整性约束违反仅在管道中的服务器上
【发布时间】:2021-09-23 08:20:26
【问题描述】:

在本地机器上运行我的集成测试时,一切都按预期进行,但是当我在 IBM Cloud 的管道中运行这些测试时,我遇到了这些异常

2021-07-14 10:36:21.002 调试 1027 --- [测试工人] org.hibernate.SQL : 删除 从 地点 2021-07-14 10:36:21.003 WARN 1027 --- [测试工作者] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:23503,SQLState: 23503 2021-07-14 10:36:21.003 错误 1027 --- [测试工作者] o.h.engine.jdbc.spi.SqlExceptionHelper:参照完整性 违反约束:“FKLWXQ52YFUYMI2I83EIJ0PU1SI:PUBLIC.RESOURCE FOREIGN KEY(LOCATION_ID) REFERENCES PUBLIC.LOCATION(ID) (1)"; SQL 陈述: 从位置删除 [23503-200]

看起来它不会以某种方式从Location 表中删除数据,然后在删除Resource 表时,它会因违反约束而失败。你有什么想法,为什么会这样?

管道在 Ubuntu 容器 内运行,我正在 MacOS

上进行开发

这是在每个测试用例之前运行的数据管理器

@BeforeEach
fun setUp() {
    dataManager.cleanDatabase()
}


fun cleanDatabase() {
    ingredientRepository.deleteAllInBatch()
    articleRepository.deleteAllInBatch()
    locationRepository.deleteAllInBatch()
    resourceRepository.deleteAllInBatch()
}

这些是实体

@Entity
@Table(name = "resource")
class Resource(

    @Column(nullable = false)
    val name: String,

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    val status: ResourceStatus,

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "location_id") // nullable = false
    val location: Location,

    @ElementCollection
    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "resource_operations", joinColumns = [JoinColumn(name = "resource_id")])
    val operations: List<ResourceOperation>
) : AuditableEntity()
@Entity
@Table(name = "location")
class Location(

    @Column(nullable = false)
    val name: String,
) : AuditableEntity()

(ID 在可审计实体中)

【问题讨论】:

    标签: java spring-boot hibernate kotlin jpa


    【解决方案1】:

    您在资源实体中有位置参考(外键关系) 位置是父资源,子资源,首先你有删除资源然后删除位置,否则你会得到Integrity Constraint

    或者在父表中添加CasecadeType.ALL,从父表删除时会删除子记录。

    【讨论】:

    • 你是否在 oneToMany 映射上添加了级联
    • 我在位置表/实体中没有对资源的引用。 (Location ID 存储在 Resource 表中,并且 Location 表中没有对 Resource 的引用)。我在资源上添加了 CascadeType.DETACH,因为 ALL 不起作用。这也没有解决问题。
    • 不,您在资源表中有位置引用,并且父项是位置,资源是子项,具体取决于您的实体实现。
    • 那么,我应该将 List 添加到 Location 中,然后在其上添加 CascadeType.ALL 吗?
    • 是的,你必须这样做
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多