我有一个返回大量数据的方法,我应该为这个方法使用@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)。该方法执行一个JPA查询并加载表的全部内容(大约1000行)。
发布于 2009-08-20 23:16:26
此方法的客户端-该方法是否已在事务中?当您使用NotSupported时,调用者事务将被挂起。如果不是,我会说,只需将Never作为事务类型。没有更好的方法,因为调用者知道他们不应该从事务内部调用此方法。一份更直接的合同。
我们总是使用Never for方法进行更多的处理,这样开发人员就可以立即意识到,如果他们已经参与了事务,就不要调用。希望能有所帮助。
发布于 2014-10-01 14:29:35
我会注意不同意,因为这是很少发生的情况下,用户不是在一个事务,在几乎所有的系统。最好的方法是使用不受支持的,这样如果调用者已经在任何事务中,事务就会挂起。除非你有一系列都不在事务作用域中的调用,否则永远不会有麻烦。简而言之,不支持是应该使用的类型。
发布于 2019-03-01 19:04:59
据我所知(至少Hibernate是这样的),您不能在事务之外使用JPA,因为实体管理器的生命周期与事务的生命周期相关联。因此,执行查询的实际方法必须是事务性的。
但是,您可以将其设置为TransactionAttributeType.REQUIRES_NEW;这将挂起任何现有事务,启动一个新事务,并在方法返回时停止它。这意味着当所有实体到达调用者时,它们将被分离,这听起来就是您试图实现的目标。
在更复杂系统中,将您的数据层与业务层完全分离并创建一组新的对象是值得的。然后,您的方法将调用JPA查询,然后使用返回的实体填充业务层中的对象,并返回这些对象。这样,调用者永远不会得到实际的JPA实体,而您可以自由地在数据层中执行您想要的操作,因为现在它只是一个实现细节。(见鬼,您可以将数据库调用更改为远程API调用,这样调用者就不必知道了。)
https://stackoverflow.com/questions/1233446
复制相似问题