2017-06-20 14 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つの質問:マージされたインスタンスでエンティティを置き換える必要があるか?エンティティにコレクションやその他の関係が含まれている場合にのみ、プロキシが含まれていますか?あなたはこのようなカテゴリを更新するために、ネイティブクエリを使用することができ、いくつかの状況下では

+1

カテゴリが独自のテーブルに存在しないため、明らかにそのカテゴリを作成できません。カテゴリは所有者オブジェクトのコンテキスト内にのみ存在するため、 'merge'はあなたがやることです –

答えて

0

(assumablyコレクションテーブル名がitem_categoriesです):

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

しかし、私はこれが可能になることは間違いでよか、これが行いますまったく意味がありません。すべてがあなたのスキーマの作成方法に依存します。

ます(推奨されていないものを)あなたのスキーマを生成し、ために(Hibernateは以下のPK/UNIQUE制約を生成するので、それは、できませんカテゴリ名列の@Column(nullable=false)とあなたの@ElementCollectionためSetを使用し続ける休止させた場合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)を使用していないのいずれかによってその制約の作成を避けることができますあなたの@ElementCollectionにはListを使用してください。手動で作成したスキーマの

可能な調整:

手動でスキーマを作成した場合(推奨されているもの)だけコレクションテーブル(item_id, name)の両方の列には、複合PK/UNIQUE制約が存在しないことに注意してください。それ以外の場合、その組み合わせを更新することはできません。

しかし、この変更/更新のすべてのカテゴリ名を適用することは、有用ではありません。あなたは本当に単一のアイテムのすべてのカテゴリで同じ名前を持ちたいですか? Categoryクラスにequals()hashCode()はどのように実装されていますか?たぶんあなたのセットは、その操作の後にアイテムごとに1つのカテゴリしか含まれていないかもしれません

関連する問題