您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用动态代理集中化JPA代码

使用动态代理集中化JPA代码

因此,您已经将事务划分逻辑封装在一个地方,并使用动态代理通过事务管理来增强现有服务并减少样板代码,对吗?

听起来对我来说还算不错。实际上,当我们谈到 时,诸如Spring或EJB之类的容器所做的事情非常相似。在实现方面,您可以使用动态代理或字节码检测来实现,甚至可以使用AspectJ。我曾经为一个很小的测试框架做过非常相似的事情。这是关于它的博客文章

我看到的棘手的部分是:

1) 。根据JPA规范,实体事务可以标记为“仅回滚 ”。这样的交易永远无法提交。因此,我觉得您应该在这两行之间进行检查:

result = method.invoke(object, args);
et.commit();

2) 。大多数具有声明式事务的系统都实现一种语义,即只有在没有事务处于活动状态时才启动事务(请参阅此EJB批注列表中的“ required” )。看来您应该isActive按照逻辑检查一下。

3) 。注意动态代理中的异常传播。代理应该对客户端尽可能透明。如果DAOExceptionDAO 以外的其他异常泄漏出去,则代理会将其转换为RuntimeException。对我来说听起来并不理想。同样不要混淆异常,因为invoke失败了,并且调用包装了异常,我认为您应该照原样重新抛出:

catch ( InvocationTargetException e )
{
     Throwable nested = e.getTargetException();
     throw nested;
}

在这种情况下使用动态代理的想法对我来说是可以的。但是我怀疑您需要仔细检查代码中的一些内容(我不记得JPA规范的所有细节以及动态代理的异常处理,但是有些棘手的情况)。这种代码可以隐藏细微的错误,因此值得花些时间使其防弹。

其他 2022/1/1 18:25:28 有376人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶