EJB 3 Transaction属性用于只读方法

时间:2009-08-05 13:59:27

标签: methods ejb-3.0 transactions readonly

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

3 个答案:

答案 0 :(得分:3)

此方法的客户端 - 已经在事务中了吗?使用NotSupported时,将暂停调用者事务。如果不是我会说,只需将Never作为交易类型。从来没有更好,因为调用者知道他们不应该从事务中调用此方法。更直接的合同。

我们总是将Never用于进行更多处理的方法,以便开发人员可以立即意识到如果他们已经参与了交易,就不会打电话。希望它有所帮助。

答案 1 :(得分:2)

我不同意,因为很少发生用户不在几乎所有系统的交易中。最好的方法是使用NOT SUPPORTED ,以便在调用者已经处于任何事务中时暂停事务。除非你有一系列的呼叫都在NO TRANSACTION范围内,否则永远不会很麻烦。简而言之,NOT SUPPORTED是应该使用的类型。

答案 2 :(得分:0)

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

但是,您可以将其设置为TransactionAttributeType.REQUIRES_NEW;这将暂停任何现有事务,开始一个新事务,并在方法返回时停止它。这意味着您的所有实体在到达呼叫者时都会被分离,这听起来像是您要实现的目标。

在更复杂的系统中,将数据层与业务层完全分离并创建一组新的对象是有必要的。然后,您的方法将调用JPA查询,然后使用返回的实体填充业务层中的对象,并返回这些对象。这样,调用者就永远无法获得实际的JPA实体,并且您可以在数据层中自由地执行所需的操作,因为现在这只是实现细节。 (哎呀,您可以将数据库调用更改为远程API调用,而您的调用者不必知道。)