2012-08-09 42 views
2

我想下面這是導致額外的更新執行和失敗我的測試。 我有一個這樣的實體。JPA本地選擇,然後本機更新..引發額外的更新

@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是 執行一個額外的更新查詢,即使我做了一個簡單的查找。

+0

你可能會發布一段代碼,顯示你如何更新你的實體/更新SQL? – Rick 2012-08-09 14:38:52

+0

我已經使用代碼片段更新了帖子。請檢查。 – praveenj 2012-08-10 09:48:48

+0

一個更正。我只是試圖刪除更新部分,我仍然看到一個額外的更新查詢得到執行。所以,在我看來,檢索本身正在造成這種情況。 – praveenj 2012-08-10 10:25:26

回答

1

問題出在運行時增強。 OpenJPA無法使用運行時增強的實體正確檢測髒狀態。

它通過構建時間增強得到解決。