问题描述
我在使用 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 (将#修改为@)