如何在不合并主机实体的情况下通过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 每个项目只包含一个类别。