检票,身份验证和交易分界
|
我正在将Wicket与自定义的PageAuthorizationStrategy一起使用,该自定义的PageAuthorizationStrategy可访问数据库以获取有关当前用户的信息,从而获得其访问权限。每个请求都由Spring Open-Session-In-View过滤器包装,以打开/关闭Hibernate会话。
这非常适合读取对数据库的访问。但是,无论何时需要进行写入操作,我都会调用服务层,该服务层使用Spring基于注释的事务处理。但我也认为这是导致特定错误的原因:当在请求A中的身份验证期间加载对象,然后在另一个请求B中进行修改,然后移交给请求A中的服务层时,该服务层正在与错误值,因为Hibernate和基础数据库都无法确保隔离。由于我一直在努力解决数据库/事务理论的具体问题,因此,如果此假设已经错误,请更正我。
解决方案的第一个想法是在开始写入事务后立即刷新为身份验证而加载的对象。尽管在身份验证需要同时修改服务要修改的对象时,这会导致问题。当Wicket使用来自表单的更改后的数据填充对象并将其通过Submit方法传递给服务时,尤其会发生这种情况。
因此,执行此操作的正确方法可能是确保将身份验证代码与可能在同一请求期间执行的任何编写代码包装在同一事务中。
我该如何在Wicket中做到“正确”?
编辑:当我意识到当引发异常后事务处理的服务方法回滚时,该问题就成了一个更大的问题,视图层会导致LazyInitializationException。显然,Spring的TransactionManager清除了会话和/或Hibernate / Spring深度中的其他内容出错,因为我可以从数据库中重新加载对象,但是尝试加载该对象中包含的集合会导致上述异常。任何想法如何去做?我想如果有一种优雅的方法来使用“每个请求一个事务”,那一切都将得到解决。
没有找到相关结果
已邀请:
2 个回复
爆山
邪罗逢确胃