JPA如何在id已存在时save报异常而不是update--希望save识别主键重复
问题
我希望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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
实体类实现
Persistable
让
isNew
方法一直返回 true 就行了但是先查询后插入应该更合理吧
你在service层暴露的接口把新增和修改2个操作区分出来不就行了?保证新增的接口传过来的实体id为空,不空就报错。