如何通过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")
还有一个问题:在哪些情况下需要通过合并实例替换实体?仅当实体包含集合或其他关系时,是否包含代理?
答案 0 :(得分:0)
在某些情况下,您可以使用本机查询来更新这样的类别(可能是集合表名称为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)
或为List
使用@ElementCollection
来创建该约束。
手动创建架构的可能调整:
如果您手动创建了架构(建议使用),请注意在集合表(item_id, name)
的两列上都没有复合PK / UNIQUE约束。否则将无法更新该组合。
但是,再次,可能应用此更改/更新所有类别名称是没有用的。你真的想在一个项目的所有类别上使用相同的名称吗?如何在Category类上实现equals()
和hashCode()
?也许你的Set在该操作后每个Item只包含一个类别。