JPA - 选择查询增量版本列

时间:2015-07-14 10:04:35

标签: jpa

每当我调用一个查询(只是你可以看到一个选择)时,我的版本列会增加一个。有谁知道这可能是怎么回事?

我已经尽可能简单地模拟了查询(以及我现在正在测试它的方式)。

查询:

String queryString = "SELECT pr FROM PaymentRequest pr where pr.status = 'PO_ERROR'";
TypedQuery<PaymentRequest> query = em.createQuery(queryString, PaymentRequest.class);
return query.getResultList();

此方法在新事务中执行(TransactionAttributeType.REQUIRES_NEW)

JPA版本:2.0

2 个答案:

答案 0 :(得分:1)

发现问题。我的实体有@Embeddable属性。实体/ embeddable通过gui中的JSF setter进行更新(应用请求值阶段)。我在嵌入式对象/属性本身上获得了javax.el.PropertyNotFoundException。当嵌入对象的所有属性都为null时,嵌入对象本身在entitymanager(hibernate jpa 2)加载对象后为null时就是这种情况。

要修复PropertyNotFoundException,我在我的实体上添加了@PostLoad方法,以便在embeddable为null时执行新的MyEmbbedableObject()。这导致Hibernate将embeddable标记为脏,从而导致更新,这当然导致版本列在提交执行查询的事务时增加。我删除了PostLoad来实例化null embeddables。这解决了查询期间“版本”增加的问题。 当然现在通过gui更新实体/ embeddable再次被打破: - )

答案 1 :(得分:0)

如果使用EclipseLink,则可以将eclipselink.read-only设置为检索结果并避免增加版本:

query.setHint(QueryHints.READ_ONLY, HintValues.TRUE);