Jakarta ee JDBC在同一事务中进行更改后,如何刷新EJB2.1实体bean?
我正在使用以下代码,在Weblogic WLS 11g的单个容器管理的事务中使用混合的EJB2.1实体bean和JDBC操作:Jakarta ee JDBC在同一事务中进行更改后,如何刷新EJB2.1实体bean?,jakarta-ee,weblogic11g,ejb-2.x,entity-bean,Jakarta Ee,Weblogic11g,Ejb 2.x,Entity Bean,我正在使用以下代码,在Weblogic WLS 11g的单个容器管理的事务中使用混合的EJB2.1实体bean和JDBC操作: Entity e = entityHome.findByPrimaryKey(entityId); e.setFieldX(initalValueX); // this performs complex analysis of data fetched by JDBC // and performs update of row in database correspo
Entity e = entityHome.findByPrimaryKey(entityId);
e.setFieldX(initalValueX);
// this performs complex analysis of data fetched by JDBC
// and performs update of row in database corresponding with entity e.
// Let say it sets newValueX on field X
recalculate(entityId, newValueX);
Entity entityUpdated = entityHome.findByPrimaryKey(entityId);
Object valueUpdatedX = entityUpdated.getFieldX();
我在这里遇到了两个问题:
重新计算
未看到setter在实体ejb上所做的更改重新计算后再次查找实体bean时,不会看到该方法所做的更改。例如,valueUpdatedX
等于initialValueX
,但应等于newValueX
重新计算之前添加了一个虚拟查找器。以下是该查找器的注释:
@ejb.finder
signature="java.util.Collection findFlushEJBCache()"
type="remote"
@wls.finder
signature="java.util.Collection findFlushEJBCache()"
load-state="True"
where-clause="0=1"
include-updates="true"
finder-sql="SELECT ID FROM entity WHERE 0=1"
诀窍是包含更新
标志。表示这是一种确保当前使用的bean上的所有更改都发送到底层数据源的方法。因此,我:
Entity e = entityHome.findByPrimaryKey(entityId);
e.setFieldX(initalValueX);
entityHome.findFlushEJBCache();
recalculate(entityId, newValueX);
方法重新计算
会看到字段X的新值
如何解决问题2?如何强制WLS从基础数据源重新加载实体以获取新数据,而无需重写重新计算方法以使用EJB?如何告诉WLS应该从缓存中删除给定的实体(无效)
我已经在这方面做了一些研究:
- 我认为根本原因是finder
findByPrimaryKey
从EJB缓存中获取数据,而不是从数据源重新加载数据李>
- 我尝试使用不同的查找器来包含更新,但效果相同李>
- 删除获取实体
e
和仅获取entityUpdated
工作并获取新数据。可能是因为缓存中并没有任何内容,所以从数据源检索数据。但这是不可接受的-我需要在重新计算之前和之后对EJB进行操作
您尝试过EntityManager.refresh()方法吗?没有,但EntityManager不是JPA/EJB3.x规范的一部分吗?我使用的应用程序使用EJB2.1。我还是会试试的。你试过EntityManager.refresh()方法吗?没有,但EntityManager不是JPA/EJB3.x规范的一部分吗?我使用的应用程序使用EJB2.1。不管怎样,我还是要试试。