[英]Why Hibernate need to recreate other entries in unidirectional ManyToMany when using List
實體(使用Set):
@Entity
class Product(
@Id
@GeneratedValue
val int: Int = 0,
val name : String,
@ManyToMany(cascade = [(CascadeType.PERSIST), (CascadeType.MERGE)])
val stores: MutableSet<Store> = mutableSetOf()
)
@Entity
class Store(
@Id
@GeneratedValue
val int: Int = 0,
val name : String = ""
)
...
val p = Product(name = "product")
em.persist(p)
val store = Store(name = "store");
p.stores += store
em.persist(store)
for (i in 1..5) {
val s = Store(name = i.toString())
p.stores += s
em.persist(s)
}
em.flush()
p.stores.remove(store)
em.flush()
結果:
Hibernate: insert into product (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: delete from product_stores where product_int=? and stores_int=?
但是,使用此實體(使用列表):
@Entity
class Product(
@Id
@GeneratedValue
val int: Int = 0,
val name : String,
@ManyToMany(cascade = [(CascadeType.PERSIST), (CascadeType.MERGE)])
val stores: MutableList<Store> = mutableListOf()
)
結果:
Hibernate: insert into product (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into store (name, int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: delete from product_stores where product_int=?
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
Hibernate: insert into product_stores (product_int, stores_int) values (?, ?)
從《 Hibernate用戶指南》中: http : //docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations-many-to-many
從@ManyToMany集合中刪除實體時,Hibernate只需刪除鏈接表中的加入記錄。 不幸的是,此操作需要刪除與給定父級關聯的所有條目,並重新創建當前正在運行的持久性上下文中列出的條目。
但我不知道其背后的原因,為什么我們不能做到與Set情況相同
帶有List的@ManyToMany注釋告訴Hibernate期望沒有索引的joinTable
在一對多關系中不使用索引列的列表被隱式視為袋,這導致
https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/performance-collections.html
袋子是最壞的情況。 由於包允許重復的元素值且沒有索引列,因此無法定義主鍵。 Hibernate無法區分重復的行。 Hibernate通過完全刪除(在單個DELETE中)並在集合發生更改時重新創建集合來解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.