spring-data-jpa 如何让JPArepository.save()只做插入而不做更新?

t1rydlwq  于 2022-11-10  发布在  Spring
关注(0)|答案(2)|浏览(305)

我正在使用JPArepository.save()将记录插入数据库,但它会自动更新数据库中的现有记录。我想做的是,如果数据库中存在具有相同主键的记录,则让它抛出异常。
我在谷歌搜索了一下解决方案,发现一个解决方案说使用saveAndFlush而不是save可以解决它。但是,在我使用saveAndFlush之后,它仍然更新现有的记录。

jtjikinw

jtjikinw1#

最后,我找到了解决方案。我只是实现了Persistable接口,并覆盖isNew()使其始终为真。
示例:

@Entity
public class ChessGame implements Persistable<Long> {

    @Id
    private Long id;

    @Override
    public boolean isNew() {
        return true;
    }
}
4xrmg8kj

4xrmg8kj2#

在JPA中,没有现成的UPDATE,无法只执行INSERT。
您需要在JpaRepository上定义自己的INSERT方法,然后从代码中调用它。

public interface MyRepository extends JpaRepository<MyRecord, Integer> {

    ....

    @Modifying(clearAutomatically = true)
    @Transactional
    @Query(value = "INSERT INTO my_table (field1, field2) "
        + "VALUES (:#{#c.field1}, :#{#c.field2})", nativeQuery = true)
    public void insert(@Param("c") MyRecord c);

}

然后在代码中插入:

final var newRecord = MyRecord.builder()
    .field1(...)
    ....
    .build();

try {
    myRepository.insert(newRecord);
} catch (DataIntegrityViolationException e) {
    ....
}

相关问题