Jakarta ee JDBC在同一事务中进行更改后,如何刷新EJB2.1实体bean?

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

我正在使用以下代码,在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 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
  • 我设法解决了问题1。在调用
    重新计算之前添加了一个虚拟查找器。以下是该查找器的注释:

    @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。不管怎样,我还是要试试。