2016-07-10 20 views
0

我有這樣Java Hibernate爲什麼namedQuery上的executeUpdate首先執行全表更新?

@org.hibernate.annotations.NamedQuery(name="namedQuery",query="update entity set .... where id=:id" 

簡單NamedQuery我有這樣

public void updateField(final Entity entity){ 
    final Session session = currentSession(); 
    final org.hibernate.Query query= session.getNamedQuery("namedQuery") 
      ...loadParameters(); 
    query.executeUpdate(); 
    return;  
} 

的方法這始終工作好了,但有時在這行代碼

query.executeUpdate(); 

有時我看到在控制檯中選擇一個實體,如實體的完整更新。我不明白爲什麼會發生這種情況。如果我真的想更新一個簡單的字段,爲什麼Hibernate會更新我所有的字段?發生這種情況時,namedQuery的唯一更新似乎沒用,因爲我認爲之前已更新過。

事情是這樣的我看到這在控制檯

Hibernate: 
/* update 
    com.models.Entity */ update 
     entity 
    set 
     BUNCH OF FIELDS 
    where 
     ID=? 

,後來我明白我真正想要的唯一字段更新

update 
    Entity 
set 
    SINGLE_FIELD_UPDATE 
where 
    ID=? 

正如我提到的,完全更新有時有時會出現不要有時全程更新出現兩次更新namedQuery正在執行!

這是爲什麼?爲什麼在執行namedQuery的實際字段之前,Hibernate會啓動完整更新並進行兩次完全更新?

我錯過了什麼?

+0

你試過用'@ org.hibernate.annotations.Entity( \t \t dynamicUpdate =真 )'註釋類類? – Apostolos

+0

它的作品..發表您的評論標記爲已解決 – chiperortiz

+0

張貼我的答案與文檔的官方鏈接。很高興我幫助! – Apostolos

回答

1

請標註與

@org.hibernate.annotations.Entity(dynamicUpdate = true) 

看到here

+0

我仍然不明白爲什麼Hibernate在執行na​​medQuery之前觸發更新? – chiperortiz

+0

你是否在cascadeType.ALL或其他類似的實體中引用它? – Apostolos

+0

它有3 @ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name =「C02」) – chiperortiz

相關問題