Java EE getSingleResult()没有收到任何实体错误

问题描述 投票:0回答:1

我正在作为CRUD测试的一部分编写更新,并且在测试代码时,出现错误消息,指出未找到任何实体。我不知道为什么,因为我的搭档执行了完全相同的代码,而且他工作得很好。我们俩都无法弄清楚发生了什么。我在getSingleResult()方法上遇到错误。

    @Test
public void updateBookTest() {
    Book book = em.createQuery("select b from Book b where b.title = :title", Book.class).setParameter("title", "createABook").getSingleResult();

    tx.begin();
    book.setTitle("updatedThisBook");
    book.setAuthor("newAuthor");
    tx.commit();

    Book updatedBook = em.find(Book.class, book.getBookId());
    assertEquals(book.getTitle(), updatedBook.getTitle());
    assertEquals(book.getAuthor(), updatedBook.getAuthor());
    System.out.println("updateBookTest:\t" + book.toString());

    tx.begin();
    book.setTitle("createABook");
    tx.commit();        
}

这是我的代码。让我知道是否需要更多信息。

java-ee
1个回答
0
投票
如果没有结果,

getSingleResult必须抛出NoResultException

所以您的测试还可以。

[检查两个都使用相同的数据库(并且没有返回数据),两个都运行相同的查询,并且两个都使用相同的jpa实现版本。

从javadoc起(自jpa 1.0起:]:>

getSingleResult

java.lang.Object getSingleResult():执行SELECT查询,该查询返回单个未键入的结果。

返回:

结果

抛出:

  • NoResultException

    -如果没有结果
  • NonUniqueResultException

  • -如果有多个结果
  • IllegalStateException

  • -如果为Java持久性查询语言UPDATE或DELETE语句调用
  • QueryTimeoutException

  • -如果查询执行超过设置的查询超时值,并且仅回滚该语句,则>]
  • TransactionRequiredException

    -如果已设置锁定模式并且没有事务
  • PessimisticLockException

    -如果悲观锁定失败并且事务已回滚
  • LockTimeoutException

    -如果悲观锁定失败并且仅回滚该语句
  • PersistenceException

    -如果查询执行超过了查询超时值设置,并且事务已回滚
  • 参考javadoc

© www.soinside.com 2019 - 2024. All rights reserved.