代码之家  ›  专栏  ›  技术社区  ›  Dani Cricco

只读方法的EJB3事务属性

  •  4
  • Dani Cricco  · 技术社区  · 15 年前

    我有一个返回大量数据的方法,我应该使用吗 @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 对于这种方法。方法执行JPA查询并加载表的全部内容(大约1000行)。

    2 回复  |  直到 11 年前
        1
  •  3
  •   OpenSource    15 年前

    此方法的客户端-是否已在事务中?使用NotSupported时,调用方事务将被挂起。如果不是,我会说,只是把从不作为事务类型。因为调用者知道他们不应该从事务内部调用这个方法,所以这是最好的。更直接的合同。

    我们总是使用从不进行更多处理的方法,以便开发人员能够立即意识到,如果他们已经参与到事务中,就不要调用。希望能有帮助。

        2
  •  3
  •   Hammad Dar    10 年前

    我很想不同意,因为很少发生用户不在中的事务中 所有的系统。最好的办法是 不支持使用 因此,如果调用方已经在任何事务中,则事务将被挂起。除非有一系列调用都不在事务范围内,否则决不会有麻烦。简言之,不受支持是应该使用的类型。

        3
  •  0
  •   Frans    5 年前

    据我所知(至少Hibernate是这样),您不能在事务之外使用JPA,因为实体管理器的生命周期与事务的生命周期相关联。因此,执行查询的实际方法必须是事务性的。

    TransactionAttributeType.REQUIRES_NEW ; 这将挂起任何现有事务,启动一个新事务,并在方法返回时停止它。这意味着您的所有实体在到达调用方时都将被分离,这听起来像是您试图实现的。

    在更复杂的系统中,完全分离数据层和业务层并创建一组新的对象是值得的。然后,您的方法将调用JPA查询,然后使用返回的实体填充业务层中的对象,并返回这些对象。这样一来,调用方就永远无法获得实际的JPA实体,您可以在数据层中自由地做您想要做的事情,因为现在它只是一个实现细节。(见鬼,您可以将数据库调用更改为远程API调用,而您的调用方不必知道。)