2017-06-20 52 views
0

如何通過JPQL查詢更新ElementCollection的元素而不合並主體實體?JPA更新ElementCollection的元素

@Embeddable 
public class Category { 
    @Column(nullable=false) 
    String name; 

    @Parent 
    Item item; 
} 

@Entity 
public class Item { 
    @ElementCollection 
    Set<Category> categories; 
} 

是否有可能重命名類別不合並項目?像這樣的東西

entityManager.createQuery("update Category c set c.name=:name where c.item = :item") 

還有一個問題:在哪些情況下需要用合併實例替換實體?只有當實體包含集合或其他關係時才包含代理?

+1

因爲類別不存在於自己的表中,那麼顯然你不能這樣做。因爲一個類只存在於它的所有者對象的上下文中,所以'merge'就是你所做的 –

回答

0

在某些情況下,你可以使用本機查詢來更新類別像這樣(assumably收集表名是item_categories):

UPDATE {h-schema}item_categories SET name=:name WHERE item_id = :itemId 

但我懷疑,這將是可能的,或者這使得一點意義。一切都取決於你的模式是如何創建的。如果讓Hibernate生成模式(不推薦),並且繼續使用@Column(nullable=false)作爲類別名稱列,Set作爲@ElementCollection繼續使用,這是不可能的,因爲Hibernate會生成以下PK/UNIQUE約束(用於例如在PostgreSQL的):

CREATE TABLE public.item_categories 
(
item_id bigint NOT NULL, 
name character varying(255) NOT NULL, 
CONSTRAINT item_categories_pkey PRIMARY KEY (item_id, name), 
CONSTRAINT fkjfe6s3h4bfur817d80v7aori8 FOREIGN KEY (item_id) 
    REFERENCES public.item (id) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

爲生成的模式可能調整:

隨着自動生成的模式,您可以通過不使用@Column(nullable=false)對日避免約束的創建e分類名稱欄或使用List作爲您的@ElementCollection

手動創建的模式可能調整:

如果是手動創建您的架構(推薦的)只是要小心,沒有對採集表(item_id, name)的兩列沒有複合PK /唯一約束。否則將無法更新該組合。

但是,也許應用此更改/更新所有類別名稱是沒有用的。你真的想在單個項目的所有類別上使用相同的名稱嗎? equals()hashCode()如何在Category類上實現?也許你的集合在該操作之後每個項目只包含一個類別。