Transactions 如何使用Guice和Jersey在GET请求中配置只读事务?

Transactions 如何使用Guice和Jersey在GET请求中配置只读事务?,transactions,jersey,guice,guice-persist,Transactions,Jersey,Guice,Guice Persist,我正在使用Guice、Guice Persist、Hibernate和Jersey。除了用@GET注释的方法外,我的所有资源方法都用@Transactional注释。这是按请求范围配置事务的正确方法吗?没有正确的方法;这取决于你想要达到的目标。在回答您的问题时,有几个单独的问题,如下所述 数据访问模式:企业Java中的传统模式是让控制器调用DAOs数据访问对象,后者处理持久性。在此模式中,事务注释将放置在DAO方法上,而不是控制器方法上。然而,许多人发现DAO过于苛刻,更喜欢将实体管理器注入控制

我正在使用Guice、Guice Persist、Hibernate和Jersey。除了用@GET注释的方法外,我的所有资源方法都用@Transactional注释。这是按请求范围配置事务的正确方法吗?

没有正确的方法;这取决于你想要达到的目标。在回答您的问题时,有几个单独的问题,如下所述

数据访问模式:企业Java中的传统模式是让控制器调用DAOs数据访问对象,后者处理持久性。在此模式中,事务注释将放置在DAO方法上,而不是控制器方法上。然而,许多人发现DAO过于苛刻,更喜欢将实体管理器注入控制器。这是一个完全可以接受的选择,从我所能告诉你的,这是你选择的方法。 线程安全:您必须知道实体管理器实例不是线程安全的,所以您的控制器不能是单例的,并且必须是请求范围的。换句话说,您不能跨多个请求共享实体管理器,因此必须将控制器设置为重新创建,并为每个请求注入新的实体管理器。 事务:如果数据检索操作只需要一个查询,则不需要事务。然而,构建一个完整的对象图通常需要许多查询。在这种情况下,为了保证一致性,您的检索必须是事务性的,因为数据可能在查询之间发生变化。有些框架实际上要求所有数据库访问都是事务性的,否则实体管理器将无法正确注入。
总之,只要控制器在请求范围内,数据访问模式就可以了。但是,如果在创建对象图时会涉及许多查询,那么GET函数应该是事务性的。

没有正确的方法;这取决于你想要达到的目标。在回答您的问题时,有几个单独的问题,如下所述

数据访问模式:企业Java中的传统模式是让控制器调用DAOs数据访问对象,后者处理持久性。在此模式中,事务注释将放置在DAO方法上,而不是控制器方法上。然而,许多人发现DAO过于苛刻,更喜欢将实体管理器注入控制器。这是一个完全可以接受的选择,从我所能告诉你的,这是你选择的方法。 线程安全:您必须知道实体管理器实例不是线程安全的,所以您的控制器不能是单例的,并且必须是请求范围的。换句话说,您不能跨多个请求共享实体管理器,因此必须将控制器设置为重新创建,并为每个请求注入新的实体管理器。 事务:如果数据检索操作只需要一个查询,则不需要事务。然而,构建一个完整的对象图通常需要许多查询。在这种情况下,为了保证一致性,您的检索必须是事务性的,因为数据可能在查询之间发生变化。有些框架实际上要求所有数据库访问都是事务性的,否则实体管理器将无法正确注入。 总之,只要控制器在请求范围内,数据访问模式就可以了。但是,如果在创建对象图时涉及许多查询,那么GET函数应该是事务性的