我正在使用彈簧資料 jpa。當我想克隆一個具有一對多關系的物體時,
fun clonePurchaseOrder(purchaseOrder: PurchaseOrder, operator: String): PurchaseOrder {
//prepare data
val items = purchaseOrder.items
//detach
items.forEach { entityManager.detach(it) }
purchaseOrder.costRevise?.let { entityManager.detach(it) }
entityManager.detach(purchaseOrder)
purchaseOrder.id = null
//modify
items.forEach {
it.id = null
it.purchaseOrder = purchaseOrder
}
//modify purchaseOrder
val now = Date()
return purchaseOrder.apply {
number = null
costRevise = null
paymentHistories = mutableListOf()
status = PurchaseOrder.Status.DRAFT
createTime = now
creator = operator
modifyTime = now
submitTime = null
submitOperator = null
closeOperator = null
closeReason = null
closeTime = null
}.save()
}
我設定purchaseOrder id = null,并且每個專案id = null,但得到以下例外
org.springframework.orm.jpa.JpaSystemException: Don't change the reference to a collection with delete-orphan enabled : com.hkmci.web.bms2.backend.database.entity.PurchaseOrder.items; nested exception is org.hibernate.HibernateException: Don't change the reference to a collection with delete-orphan enabled : com.hkmci.web.bms2.backend.database.entity.PurchaseOrder.items
這里是 purchaseOrder 物體和 items 物體
@Entity
class PurchaseOrder(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,
...(other Column)
@OneToMany(mappedBy = "purchaseOrder", cascade = [CascadeType.ALL], orphanRemoval = true)
var items: MutableList<PurchaseOrderItem> = mutableListOf(),
...(other Column)
@Entity
class PurchaseOrderItem(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,
@ManyToOne(fetch = FetchType.LAZY)
var purchaseOrder: PurchaseOrder,
...(other column)
有人能幫忙嗎?
uj5u.com熱心網友回復:
//clone a purchaseOrder, new purchaseOrder will be reset to Draft
fun clonePurchaseOrder(purchaseOrder: PurchaseOrder, operator: String): PurchaseOrder {
//clear all relationships
purchaseOrder.costRevise?.let { entityManager.detach(it) }
purchaseOrder.items.forEach {
entityManager.detach(it)
it.id = null
}
purchaseOrder.paymentHistories.forEach {
entityManager.detach(it)
}
entityManager.detach(purchaseOrder)
//reset all fields
val now = Date()
purchaseOrder.apply {
id = null
number = null
costRevise = null
items = items.toMutableList()
paymentHistories = mutableListOf()
status = PurchaseOrder.Status.DRAFT
createTime = now
creator = operator
modifyTime = now
submitTime = null
submitOperator = null
closeOperator = null
closeReason = null
closeTime = null
}
//save
return purchaseOrderRepository.save(purchaseOrder)
}
無需重新關聯 items 和 purchaseOrder ,只需清除所有關系,設定 id = null 并保存
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490054.html
上一篇:如何從OrderServiceImpl.java類中的用戶表中獲取電子郵件資料
下一篇:使用帶有休眠5.6的tomcat10時顯示錯誤訊息“NoClassDefFoundError:javax/persistence/Entity”
