在JPA(eclipselink)应用程序中,我有一个ejb业务操作,在继续使用非本机jpa调用之前必须执行本机查询(oracle)。该本机调用是某种报告,它不会选择甚至更改我在数据库中的任何实体。
然而,eclipseLink将事务标记为脏,并且以下非本机jpa调用不再使用共享缓存。 eclipseLink用户指南中记录了此行为,请参阅here,以及预期的。
但有没有办法告诉eclipseLink不要将事务标记为脏,例如本机查询中的一些提示?我需要以下jpa-queries才能使用共享缓存。
创建本机查询的代码是拦截器的一部分,如下所示:
public class MyInterceptor {
@PersistenceContext( name="xxxx" )
private EntityManager em;
@AroundInvoke
Object init( InvocationContext context ) throws Exception {
// the result of the native query is a plain date resulting
// from a non-trivial query of course
Date now = (Date)em.createNativeQuery( "select sysdate from dual" )
.getSingleResult();
return context.proceed();
}
}
其余的业务逻辑封装在ejb中,例如
@Stateless
public class BusinessEJB {
@PersistenceContext(name="xxxx")
private EntityManager em;
@Interceptors( { MyInterceptor.class } )
public List<Result> find() {
// Result is quite complex with lots of related detail objects
// which I would like to fetch from the shared cache.
// The entity Result is annotated @Cacheable( false ) and the
// detail entities are @Cacheable( true ). persistence.xml contains
// <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
return em.createNamedQuery("Result.findAll",Result.class)
.getResultList();
}
}
每当我移除拦截器时,一切都很好。当我们在persistence.xml中启用查询日志时,我们看不到详细对象的查询。但添加拦截器会导致大量数据库调用获取详细信息。
我在glassfish 3.1.2.2上使用jee6 with eclipselink 2.3.2