当前位置: 首页 > 知识库问答 >
问题:

如果hibernate和postgres中不存在,如何执行performant插入?

范承教
2023-03-14

我目前正在设计一个图像标签系统。从图像到标签有n… m关系。标签本身受到唯一约束的限制。
现在假设用户上传带有标签[动物、魔法、夏天]的图像。标签可能已经存在于数据库中,也可能不存在。如果不存在,则必须插入。现在我无法选择并插入缺少的标签,因为两个线程可能并行,并且一个上传将由于唯一的约束违规而失败。

我目前的设计有效,但似乎非常不正常(每个标签一个插入)。由于ERMAGE类型的postgres限制,我必须对这些插入使用新事务:当前事务被中止,命令被忽略,直到事务块结束。有没有更好的方法?

    @Override
    @Transactional
    public String createImageEntry(MyDto myDto, long accountId) {
        for (String tag : myDto.getTags()) {
            insertTags(tag);
        }

        Set<ImageTag> tags = myDto.getTags().stream().map(s -> imageTagRepository.findByTag(s).orElseThrow()).collect(Collectors.toSet());

        Image image = new Image(...);
        imageRepository.persist(image);
        return image.getExternalKey();
    }

    @Transactional(Transactional.TxType.REQUIRES_NEW)
    public void insertTags(String tag) {
        ImageTag imageTag = new ImageTag();
        imageTag.setTag(tag);
        try {
            imageTagRepository.persistAndFlush(imageTag);
        } catch (PersistenceException ignored) {
        }
    }

共有1个答案

叶淇
2023-03-14

可以使用@SQLInsert来更改用于插入语句的 SQL。有关更多详细信息,请参阅以下答案:Hibernate事务和使用附加的并发性(saveOr 更新)

 类似资料:
  • 问题内容: 在一个SQL语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。 我有: 该列具有唯一约束。我尝试在末尾追加,但这仍然不返回现有行。 为什么是这样?我以为我的最后一条语句将被执行并返回。有任何想法吗? 注意:由于某些复杂的竞争条件,我无法使用Postgres函数或多个SQL语句。 问题答案: WITH d(t, e) AS ( VALUES (‘abcdefg’, ‘2014-0

  • 问题内容: 我有下表: 如果给定的ID不存在,我想插入具有默认Val的ID。但是,如果它已经存在,我想增加Val的值。 我有以下代码: 并且它可以工作,但是我想用一个SQL语句来完成。我可以吗? 编辑 : 从@ Xikinho90的答案,我的最终代码是 问题答案: 您可以使用插入或替换。 我认为这可以解决问题 您只需要用输入的ID替换数字 谢谢奇科

  • 问题内容: 我从谷歌搜索开始,发现这篇文章讨论了互斥表。 我有一张约有1400万条记录的表。如果我想以相同的格式添加更多数据,是否有一种方法可以确保我要插入的记录在不使用一对查询的情况下就不存在(即,要检查的一个查询和要插入的一个查询是结果集是空的)? 字段上的约束是否可以确保如果该约束已经存在,该约束将失败? 似乎 只有 一个约束条件,当我通过php发出插入命令时,脚本就发出了嘎嘎叫声。 问题答

  • 问题内容: 我想使用java8替换以下代码: 以下伪代码由于没有方法而无法使用,但无论如何它说明了我的目的: 问题答案: 对于Java 9或更高版本,最可能需要的是: 使用vavr之类的方法进行固化可能会得到更整齐的代码,但是我还没有尝试过。

  • 问题内容: 我是mysql的新手。我在将记录插入到table1中时遇到问题,如果它在table2中不存在。我有2个表table1和table2形式: 我试图仅在table2的“开始”和“停止”列中不存在值时才将值插入到table1的开始和停止字段值中。如果存在,我需要抛出一个错误。这些表没有主键外键关系。抱歉,我不知道正确的语法,但是我必须在mysql和PHP中执行类似的操作。 在插入到table