微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JPA 持续时的唯一约束

如何解决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 举报,一经查实,本站将立刻删除。