代码之家  ›  专栏  ›  技术社区  ›  praveenj

JPA本机选择后接本机更新。。激发附加更新

  •  2
  • praveenj  · 技术社区  · 12 年前

    我正在尝试以下操作,这导致了额外的更新执行,并使我的测试失败。 我有一个这样的实体。

    @Entity
    @SqlResultSetMapping(name = "tempfilenameRSMapping",
            entities = { @EntityResult(entityClass = MyEntity.class) }, 
            columns = { @ColumnResult(name = "TEMPFILENAME") })
    //The reason for this mapping is to fetch an additional field data through join.
    @Table(name = "MY_TABLE")
    public class MyEntity {
    
       @Id
       @Column(name="ID")
       private String id;
    
       @Column(name="NAME")
       private String name;
    
       @Column(name="DESC")
       private String description;
    
       @Column(name="STATUS")
       private String status;
    
       //follwed by getter setters
    
    }
    

    我正在尝试使用本机查询进行检索。对于检索到的实体,我执行本机更新(本机更新的原因是我只想更新一个字段)。请注意,我不是直接更新检索到的实体。

    我观察到的是,我的更新没有得到正确执行。当我打开TRACE时,我注意到在刷新时openJPA正在执行一个额外的更新查询,因此覆盖了我的原始更新。

    例如。

    SELECT M.ID, M.NAME, M.DESC, O.TEMPFILENAME FROM MY_TABLE M, OTHER_TABLE O WHERE M.ID = ?
    
    UPDATE MY_TABLE SET STATUS = ? WHERE ID = ?
    
    UPDATE MY_TABLE SET ID=?, NAME=?, DESC=?, STATUS=? WHERE ID = ?
    

    如何跳过自动更新?

    编辑: 以下是我们用于执行查询的例程。

    下面的例程返回一个命名的本机查询sql。

    public String getNamedNativeQuerySql(EntityManagerFactory emf, String qryName) {
        MetamodelImpl metamodel = (MetamodelImpl) emf.getMetamodel();
        QueryMetaData queryMetaData = 
        metamodel.getConfiguration().getMetaDataRepositoryInstance().getQueryMetaData(null, qryName, null, true);
        String queryString = queryMetaData.getQueryString();
        return queryString;
    }
    

    检索代码:

    Query query = entityManager.createNamedQuery("retrieveQry");
    query.setParameter(1, id);
    Object[] result = (Object[]) query.getSingleResult();
    MyEntity entity = (MyEntity) result[0];
    String tempFileName = (String) result[1];
    

    检索后的更新代码:

    Query qry = entityManager.createNamedQuery("updateQry");
    qry.setParameter(1, status);
    qry.setParameter(2, entity.getId() );
    qry.executeUpdate()
    

    编辑:

    即使没有更新声明,我也看到了问题。OpenJPA是 执行额外的更新查询,即使我做了一个简单的查找。

    1 回复  |  直到 12 年前
        1
  •  1
  •   praveenj    12 年前

    问题出在运行时增强上。OpenJPA无法正确检测运行时增强实体的脏状态。

    通过进行构建时增强来解决此问题。