我在考虑使用打开会话视图(OSIV)过滤器或自带的春天,因为它似乎就像是我作为一个开发者一个方便的方式拦截。如果这是你推荐的东西,你建议使用过滤器或拦截器为什么?

我也想知道它如何与混合的的HibernateTemplate 并如果我将失去将方法标记为的 @Transactional(readOnly的=真)等,从而失去的能力的能力得到一些更细粒度的事务控制?

是否有某种如何对这种使用Hibernate和Spring一个三层架构解决方案集成的最佳实践(如我想我的决定使用检票呈现应该没多大关系)?

如果我使用OSIV我至少会永远不会遇到的延迟加载异常,而另一方面我的交易将能够在此视图未提交,以及提交之前活得更长。

有帮助吗?

解决方案

这是真正的个人喜好问题。

我个人喜欢在服务层具有事务边界。如果你开始思考SOA,到服务的每一个电话应该是独立的。如果您的视图层调用2个不同的服务,(我们可以说,这已经是一个代码味道),那么这2个服务应该彼此独立的行为,可以有不同的交易结构,等等......有没有交易的开放式外服务还有助于确保没有修改出现服务之外。

OTOH,你将不得不考虑多一点,你在你的服务做什么(延迟加载,分组功能在同一个服务方法,如果他们需要一个共同的事务性,等等)。

一个图案,可以帮助减少延迟加载误差是使用值对象服务层的外侧。该服务应始终加载所需的所有数据,并将其复制到虚拟组织。你失去了你的持久性对象和视图层之间的直接映射(这意味着你必须编写更多的代码),但你可能会发现,你在获得清晰...

编辑:的决定将基于权衡,所以我仍然认为这是至少部分是个人喜好问题。交易业务层清洁的感觉对我来说(更多SOA状,逻辑清楚地是抑制到服务层,不同的呼叫清楚地分开,...)。这种做法的问题是LazyLoadingExceptions,可以通过使用VO来解决。如果VO只是一个持久化对象的副本,那么,它显然是DRY原则休息。如果你使用VO,就像您使用数据库视图,然后VO是你持久化对象的简化。它仍然是更多的代码来写,但它会使您的设计更加清晰。如果你需要插入一些授权方案就变得非常有用:如果某些字段仅显示给特定的角色,你可以把授权的服务水平和从未返回不应被视为数据

其他提示

  

如果我使用OSIV我将至少从未   碰上迟缓装载的例外

这是不正确的,实际上它非常容易碰到臭名昭著的LazyInitializationException中,只需加载一个对象,并尝试读它的一个属性,该视图后,根据你的配置,你会得到这个谎言

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top