问题
我希望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?这样是否可行?
是否其他的更优的解决方案?
实体类实现
Persistable
让
isNew
方法一直返回 true 就行了但是先查询后插入应该更合理吧