JPA Update element of ElementCollection



如何在不合并主机实体的情况下通过JPQL查询更新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")

还有一个问题:在哪些情况下需要用合并的实例替换实体?是否仅当实体包含集合或其他关系时,才包含代理?

在某些情况下,您可以使用本机查询来更新类别,如下所示(假设集合表名称为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)或对@ElementCollection使用List来避免创建该约束。

手动创建的架构的可能调整:

如果您手动创建了架构(建议这样做),请注意收集表(item_id, name)的两列上都没有复合 PK/UNIQUE 约束。否则,将无法更新该组合。

但同样,也许应用此更改/更新所有类别名称没有用。是否确实要在单个项目的所有类别上使用相同的名称?如何在类别类上实现equals()hashCode()?也许在该操作后,您的 Set 每个项目只包含一个类别。

最新更新