JPA 持续时的唯一约束

问题描述

我在使用 JPA 更新子记录时遇到 oracle DB 唯一键约束错误我有父规则表和子条件表,条件表具有唯一键约束以避免重复子记录。 当用户尝试更新/插入多个子条件记录时,它会抛出约束错误

假设条件表有条目: [{id=100,rule=1,parameterName=P1,operator=O1,value=V1}] 在表中,还有另一个调用来更新现有并添加一个新的插入条件: [{id=100,parameterName=P2,operator=O2,value=V2},{id= new insert,value=V1}] 然后JPA未能保存新记录,因为类似的记录已经存在并且表约束不允许再次插入。

似乎 JPA 尝试先插入然后更新记录,但违反了表级别的约束。

请建议如何使用具有唯一键约束的 JPA 来持久化记录。由于审核,我无法删除子记录然后再次保留。

规则

@Table(name = "RULE")
@Entity
data class Rule(
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long? = null,@Column(name = "NAME",nullable = false)
    val name: String

) : Serializable {
    @JsonIgnore
    @OnetoMany(mappedBy = "rule",cascade = [CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE],orphanRemoval = true,fetch = FetchType.LAZY)
    var conditions: MutableList<Condition> = mutablelistof()

    @JsonIgnore
    fun addConditions(conditions: List<Condition>): List<Condition> {
        this.conditions.addAll(conditions)
        return conditions
    }
}

条件

@Table(name = "MONITORING_CONDITION")
@Entity
data class Condition(

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long?,@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "RULE_ID",referencedColumnName = "ID",nullable = false)
    val rule: Rule,@Column(name = "ParaMETER_NAME",nullable = false)
    val parameterName: String,@Column(name = "OPERATOR",nullable = false)
    val operator: String,@Column(name = "VALUE",nullable = false)
    val value: String
)

约束

CONSTRAINT CONDITION_UK UNIQUE (RULE_ID,ParaMETER_NAME,OPERATOR,VALUE)

JPA 保存

rule.apply {
        this.conditions.clear()
        this.addConditions(it.conditions.map {
            Condition(...)
        })
    }
    ruleRepository.save(rule)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)