2012-04-30 81 views
0

我正在嘗試使用JPA更新現有記錄。以下鏈接似乎表明,更新記錄的唯一方法是爲其編寫更新查詢。 enter link description here使用openJPA持久更新查詢

這很好。但是,我想知道爲什麼我將這個存儲過程用於開放JPA的魔法? 我想,如果我有一個JPA對象,如果我想堅持到數據庫使用類似於此

emf.persist(launchRet)

通話的JPA框架將檢查是否記錄媒體鏈接存在的情況下,如果是這樣,它會繼續對該記錄進行更改,如果沒有,則只會添加一條新記錄。這將是非常酷的。相反,我將不得不最終在更新查詢中自己編寫所有這些邏輯。這很好,但爲什麼我不能只使用存儲過程並將所有必需的值傳遞給它?

UPDATE:CODE解釋什麼是我最後的評論是關於

try{ 
     launchRet = emf.find(QuickLaunch.class, launch.getQuickLaunchId()); 
     if(launchRet==null){     
      emf.getTransaction().begin(); 
      emf.persist(launchRet); 
      emf.getTransaction().commit(); 
     } 
     else{ 
      emf.refresh(launchRet); 
     } 
    } 

變量啓動被傳遞到方法...

public QuickLaunch UpdateQuickLaunchComponent(QuickLaunch launch) 

我會簡單剛纔設置的發現推出launchRet等於到通過的發射?

回答

1

閱讀您發佈的鏈接:

您可以在一個修改實體實例以下幾種方式:

  • 使用一個更新查詢
  • 使用實體的公開API [。 ..]

我們的方式版在99%的情況是第二方式:

Foo someExistingFoo = em.find(Foo.class, someExistingFooId); 
someExistingFoo.setSomeValue(theNewValue); 
// no need to call any persist method: the EM will flush the new state 
// of the entity to the database when needed 

當然,實體還可以經由一個查詢加載,或者通過實體的曲線圖進行導航。

如果您有分離的實體,並且想要將其狀態保留到數據庫,請使用EntityManager.merge()方法。它發現具有相同的ID作爲分離的一個作爲參數傳遞,拷貝從分離實體到所述附接了一個的狀態下的實體,並返回一個連接:

Foo attachedModifiedFoo = em.merge(detachedFoo); 

如果斷開的實體不是持久(即沒有任何ID),那麼它被創建並持久化。

+0

那麼這是好的,但是我有一個已經someExistingFoo,我想堅持嗎?例如,有人通過FooId搜索someExistingFoo,如果找到了,我應該將它設置爲等於已經傳入的someExistingFoo對象嗎?我會舉一個例子來解釋我在說什麼。 – SoftwareSavant

+0

請參閱我對答案的編輯。 –

+0

啊哈......資本好的先生。我記得在某處讀了一些關於entityManager.Merge(Object obj)的東西,我想我沒有建立連接。感謝您的領導! – SoftwareSavant