Spring Boot + JPA + 异常处理

Gna*_*ana 2 java spring hibernate jpa spring-boot

我正在研究将我们的项目转换为 Spring Boot 应用程序的概念验证。我有一个具有两种方法的存储库类:保存和查找。

@Repository
public class UserDataRepo {
    private EntityManager em;

    public boolean save(UserDataModel model) {
        try {
            UserDataModel existingModel = find(model.getTable(), model.getFieldName();
            model.setId(existingModel.getId());
            this.em.merge(model);
            this.em.flush();
            return false;
        } catch (NoResultException e) {
            this.em.persist(model);
            this.em.flush();
            return true;
        }
    }

    public UserDataModel find(String table, String field) {
        Query query = this.em.createQuery(FIND_USERDATA_STATEMENT);
        query.setParameter("table", table);
        query.setParameter("fieldName", field);
        return (UserDataModel) query.getSingleResult(); // throws NoResultException
    } 
}
Run Code Online (Sandbox Code Playgroud)

在我的 Spring Boot 应用程序类中,我添加了@EnableJpaRepositories, @EnableTransactionManagement。我的应用程序启动正常,没有任何错误。但正如你所看到的,save方法依赖于find方法来确定是合并还是持久。如果没有记录,find 方法将抛出 NoResultException。我观察到它永远不会落入 save 方法的 catch 块内。Spring Boot 只是抛出一个错误,指出 NoResultException。

在合并的情况下,它就像一个魅力。所以这意味着实体管理器工作正常。

不知道还需要配置什么。有什么想法吗?

从日志中添加错误:

org.springframework.dao.EmptyResultDataAccessException: No entity found for query; nested exception is javax.persistence.NoResultException: No entity found for query
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:389)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:223)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
Run Code Online (Sandbox Code Playgroud)

Dom*_*cEU 5

我不会推荐这种行为。getSingleResult()不建议这样使用。在此处阅读有关为什么不在 JPA 中使用 getSingleResult 的更多信息。相反,尝试这样的查询。

    Query query = this.em.createQuery(FIND_USERDATA_STATEMENT);
    query.setParameter("table", table);
    query.setParameter("fieldName", field);

    List results = query.getResultList();
    if (results.isEmpty()) {
        return null;
    }
    else if (results.size() == 1)  {
        return results.get(0);
    }
    throw new NonUniqueResultException();
Run Code Online (Sandbox Code Playgroud)