我正在作为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();
}
这是我的代码。让我知道是否需要更多信息。
getSingleResult必须抛出NoResultException。
所以您的测试还可以。
[检查两个都使用相同的数据库(并且没有返回数据),两个都运行相同的查询,并且两个都使用相同的jpa实现版本。
从javadoc起(自jpa 1.0起:]:>
getSingleResult
java.lang.Object getSingleResult():执行SELECT查询,该查询返回单个未键入的结果。
返回:
结果抛出:
NoResultException
-如果没有结果- -如果有多个结果
NonUniqueResultException
- -如果为Java持久性查询语言UPDATE或DELETE语句调用
IllegalStateException
- -如果查询执行超过设置的查询超时值,并且仅回滚该语句,则>]
QueryTimeoutException
TransactionRequiredException
-如果已设置锁定模式并且没有事务PessimisticLockException
-如果悲观锁定失败并且事务已回滚LockTimeoutException
-如果悲观锁定失败并且仅回滚该语句PersistenceException
-如果查询执行超过了查询超时值设置,并且事务已回滚参考javadoc