5

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

4

3 回答 3

3

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

我们总是将 Never 用于执行更多处理的方法,以便开发人员立即意识到如果他们已经参与事务,则不要调用。希望能帮助到你。

于 2009-08-20T23:16:25.777 回答
3

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

于 2014-10-01T06:29:34.613 回答
0

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

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

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

于 2019-03-01T11:04:59.443 回答