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)
我不会推荐这种行为。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)
| 归档时间: |
|
| 查看次数: |
12045 次 |
| 最近记录: |