JPA本机选择后跟本机更新..触发其他更新

时间:2012-08-09 11:31:51

标签: jpa openjpa

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

@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时,我注意到在flush上,openJPA正在执行一个额外的更新查询,因此会覆盖我的原始更新。

e.g。

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()

编辑:

  

即使没有update语句,我也看到了问题。 OpenJPA是   即使我做了简单的查找,也会执行额外的更新查询。

1 个答案:

答案 0 :(得分:1)

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

通过构建时间增强解决了这个问题。