2012-01-18 91 views
0

在我的JPA实现中,我做了一个em.find()来选择一个对象列表并修改这些对象。接下来,我更新了这些修改的对象,调用事务内的em.merge()(TX为了坚持其他相关的东西)。JPA查找并更新策略

除了SELECT发生两次(一次发现过程中和其他过程中发生的事实)之外,这种工作方式非常棒,我认为这对我来说是多余的和性能杀手。

我不愿意在em.merge()的事务边界内带find(),即使这样做会解决后面的SELECT问题。

定义我自己的NamedQuery是更新这些对象而不发出另一个SELECT的唯一方法?

感谢

+0

你可以指定第二个SELECT在哪里发生? – perissf 2012-01-18 18:42:40

+0

你为什么不愿意将find()调用放入你的tran?你在使用什么提供商? – Rick 2012-01-18 19:09:40

+0

@Rick Select需要几分钟时间才能执行(因为非索引列查询)。选择执行时间超出交易的额外时间(JBOSS限制为5分钟)。我可能会增加时间,但将此作为最后的选择。 – phewataal 2012-01-18 19:41:14

回答

0

如果您正在使用JTA管理的EntityManager那么每个事务边界将是一个新的持久化上下文,除非你已经配置了共享缓存,你将不得不回到数据库。

您使用的是JPA提供程序?如果您使用的是EclipseLink,默认情况下会启用共享缓存。

对于JPA事务,如果您使用相同的EntityManager进行查找和合并,则它仍应位于持久性上下文中。

+0

我正在使用Hibernate作为JPA提供程序。在我的代码中,Entitiymanager被定义为DAO中的一个实例变量.DAO在包含业务逻辑的bean中使用@EJB引用。在这里我调用dao.find()和dao.merge()。这是否意味着我每次打电话都使用不同的EM? – phewataal 2012-01-19 15:58:43