簡體   English   中英

為什么使用List時Hibernate需要在單向ManyToMany中重新創建其他條目

[英]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.

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