JPA如何在id已存在时save报异常而不是update--希望save识别主键重复

发布于 2022-09-11 23:15:53 字数 1183 浏览 9 评论 0

问题

我希望Jpa在Save时,若主键已存在,直接报异常。
但Spring Jpa在Save时,进行了isNew的判断,若new则insert(persist),否则update(merge),我看到的JPA实现代码如下:

// JpaRepository.java
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
    private final EntityManager em;

    @Transactional
    public <S extends T> S save(S entity) {

        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }
    // ........
}

当前已有解决方案,希望确认一下是否有更优解。

当前的实现方案-自定义Query

@Modifying
@Query(nativeQuery = true,
       value = "INSERT INTO table_name(id, XXX, YYY) VALUES (:id, :XXX, :YYY);")
void insertXXXXX(@Param("id") String id,
                 @Param("XXX") String XXX,
                 @Param("YYY") String YYY);

此方案解决了问题,但感觉在维护上多了个SQL,如果有字段变化要同时维护数据库、DO、sql语句,希望有更好的解决方案

其他思路--EntityManager?

save method实际上调用了注入的EntityManager的persist或者merge,是否可以直接注入EntityManager调用persist?这样是否可行?

是否其他的更优的解决方案?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小草泠泠 2022-09-18 23:15:53

实体类实现 Persistable
isNew 方法一直返回 true 就行了
但是先查询后插入应该更合理吧

南街女流氓 2022-09-18 23:15:53

你在service层暴露的接口把新增和修改2个操作区分出来不就行了?保证新增的接口传过来的实体id为空,不空就报错。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文