首页 > 解决方案 > 我可以使用 JPA 存储库查询将元素添加/插入到我的 ElementCollection 中吗?

问题描述

我正在使用基于 H2 文件的数据库编写 Spring Boot 应用程序。我有几个并行运行的线程,所以我试图找到将元素添加到我的实体的嵌入式字符串集的最佳方法 - 一个 ElementCollection。

获取完整实体只是为了修改一个字段并保存整个实体,即使我只更改了一个字段,看起来既笨重又冒险 - 如果另一个线程正在更改关于同一实体的其他内容怎么办 - 我不想覆盖那些不相关的更改。

假设我有一个实体产品:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Product {
    @Id
    private int id;

    private String description;
    private boolean soldOnline;

    @ElementCollection(fetch = EAGER)
    private Set<String> statesWhereAvailable = new HashSet();
}

我有一个线程通过并初始化boolean soldOnline标志,另一个线程通过并添加到人们可以在店内购买此产品的一组不同状态。如果同时更新同一产品,我不希望第二个线程撤消第一个线程中所做的更改,因为它恰好在第一个线程完成保存之前获取实体。

我希望有一种方法可以编写 Jpa Repository 查询来更新该 ElementCollection,但我在任何地方都找不到任何示例。我希望能够写出这样的东西:

@Repository
public interface ProductRepository extends JpaRepository<Product, Integer> {
    @Transactional
    @Modifying
    @Query(value = "update Product p " +
            "set i.statesWhereAvailable = i.statesWhereAvailable + :state " +
            "where p.id = :id")
    void addVendorToRelatedVendors(@Param("id") int id,
                                   @Param("state") String state);
}

任何建议将不胜感激!

标签: javamultithreadingspring-bootspring-data-jpaspring-repositories

解决方案


推荐阅读