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