ElementCollection的JPA Update元素

时间:2017-06-20 00:43:30

标签: hibernate jpa

如何通过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")

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

1 个答案:

答案 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只包含一个类别。