我正在实现一个功能,如果在将数据写入DB时有任何异常,我们应该在失败之前重试它5次。我已经实现了该功能,但无法使用arquillian测试对其进行测试。
我们使用JPA和Versant作为数据库。直到现在,我正在对arquillian测试进行调试,一旦我的流程达到数据库处理程序代码,我就停止了数据库。但这是最糟糕的测试方式。
你有什么建议如何实现同样的目标吗?
答案 0 :(得分:0)
原生解决方案
在数据库中除以零就有旧技巧。在选择时你可以尝试:
select 1/0 from dual;
插入时间(需要一张表):
insert into test_table (test_number_field) values (1/0);
纯JPA解决方案
您可以尝试使用@Version
注释并将其递减以抛出OptimisticLockException
。这不是在数据库中引发的,而是在Java层中引发的,但是满足了您的需求。
这些都将导致数据库失败。
答案 1 :(得分:0)
考虑到JPA,最简单的方法是向数据访问层添加方法,使用该方法可以运行本机查询。然后针对不存在的表或类似的东西运行查询。所以在我的DAO实用程序中,我找到了这样的方法:
public List findByNativeQuery(String nativeQuery, Map<String, Object> args) {
try{
final EntityManager em = getEntityManager();
final Query query = em.createNativeQuery(nativeQuery);
if (args!=null && args.entrySet().size()>0) {
final Iterator it = args.entrySet().iterator();
while (it.hasNext()) {
final Map.Entry pairs = (Map.Entry)it.next();
query.setParameter(pairs.getKey().toString(), pairs.getValue());
}
}
return query.getResultList();
}
catch (RuntimeException e) {
// throw some new Exception(e.getMessage()); // the best is to throw checked exception
}
}