EJB 3 Transaction属性用于只读方法

问题描述 投票:4回答:3

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

methods ejb-3.0 transactions readonly
3个回答
3
投票

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

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


2
投票

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


0
投票

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

但是,您可以将其设置为TransactionAttributeType.REQUIRES_NEW;这将暂停任何现有事务,启动一个新事务,并在方法返回时停止它。这意味着所有实体在到达调用者时都会被分离,这听起来就像你想要实现的那样。

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

© www.soinside.com 2019 - 2024. All rights reserved.