我正在使用 Guice、Guice Persist、Hibernate 和 Jersey。我所有的资源方法都用@Transactional 注释,除了用@GET 注释的方法。这是配置每请求事务范围的正确方法吗?
问问题
789 次
1 回答
4
没有“正确”的方式;这取决于您要达到的目标。回答您的问题涉及几个单独的问题,如下所述。
- 数据访问模式:企业 Java 中的传统模式是让您的控制器调用处理持久性的 DAO(数据访问对象)。在此模式中,您的事务注释将放置在 DAO 方法上,而不是您的控制器方法上。然而,许多人发现 DAO 太过分了,他们更喜欢将实体管理器注入到控制器中。这是一个完全可以接受的替代方案,据我所知,这是您选择的方法。
- 线程安全:您必须知道实体管理器实例不是线程安全的,因此您的控制器不能是单例的,并且必须是请求范围的。换句话说,您不能在多个请求之间共享一个实体管理器,因此您必须将控制器设置为重新创建,并为每个请求注入一个新的实体管理器。
- 事务:如果您的数据检索操作只需要一个查询,则不需要事务。然而,构建一个完整的对象图通常需要很多查询。在这种情况下,您的检索必须是事务性的以保证一致性,因为数据可能会在查询之间发生变化。有些框架实际上要求所有数据库访问都是事务性的,否则实体管理器将无法正确注入。
总之,您的数据访问模式很好,只要您的控制器是请求范围的。但是,如果在创建对象图时将涉及许多查询,则您的“GET”函数应该是事务性的。
于 2012-03-13T03:24:33.913 回答