合并和保存或更新的实体的更新引发约束冲突异常


I have an entity which contains a Map:
  @OneToMany(fetch = FetchType.EAGER)
  @JoinTable(name = "matrix_columns", joinColumns = Array(new JoinColumn(name = "id")))
  @MapKey(name="tenor")
  @Fetch(value = FetchMode.SELECT)
  @Access(AccessType.PROPERTY)
  def getInputMapNative: java.util.Map[Int,Column] = inputMap

并且该列包含一个数组

  @(OneToMany @field)(cascade = Array(CascadeType.ALL))
  @OrderColumn(name = "input_index")
  @Fetch(value = FetchMode.SELECT)
  var inputs:Array[Input] = _

因为我被Hibernate 3.6和这个错误卡住了 无法延迟初始化集合,没有会话或会话关闭(尽管急切地获取),我尝试实现以下解决方法:

  • 我合并并保存列
  • 我更新地图并合并并保存父实体

(因为我不能依赖休眠级联)

但是,我仍然收到一个我还没有准备好解决的异常

09:41:26.160 [GS-Notifier-pool-6-thread-2] ERROR o.h.util.JDBCExceptionReporter - Duplicate entry '781' for key 'inputs_id'
09:41:26.167 [GS-Notifier-pool-6-thread-2] ERROR o.h.e.d.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: could not insert collection: [Column.inputs#69]

这是我的代码,我想用它来在数据库中创建或保存新矩阵

val mergedColumns = matrix.getInputMap.map {
                              case(tenor,column) =>
                                column.inputs foreach{
                                  item =>
                                    val mergedItem = session merge item
                                    session saveOrUpdate mergedItem
                                }
                                (tenor, (session merge column).asInstanceOf[Column])
                            }
  matrix.setInputMapNative(mergedColumns)
  val mergedMatrix = session merge matrix
  session saveOrUpdate mergedMatrix
  transaction.commit()
异常与

主键inputs_id的唯一性有关。 Hibernate尝试两次插入相同的条目,所以我想您合并和保存列并更新地图的方式是这里的问题。

请考虑 Session.saveOrUpdate。

为了获得更好的答案,请提供其他信息,例如用于插入新条目的代码片段。

最新更新