簡體   English   中英

合並並保存更新的實體的SaveOrUpdate會引發ConstraintViolationException

[英]Merge and saveOrUpdate of updated entity throws constraintViolationException

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,並且此錯誤未能延遲初始化集合,所以沒有關閉任何會話或會話(盡管急於獲取) ,所以我嘗試實現以下解決方案:

  • 我合並並保存列
  • 我更新地圖,合並並保存父實體

(因為我不能依靠Hibernate級聯)

但是,我仍然遇到一個無法解決的異常

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()

異常與主鍵input_id的唯一性有關。 Hibernate嘗試兩次插入相同的條目,所以我想您的方式是合並和保存列以及更新地圖。

請考慮Session.saveOrUpdate。

為了獲得更好的答案,請提供其他信息,例如用於插入新條目的代碼段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM