EntityManager refresh i merge

0

Witam

Nie rozumiem troche ponizszego kodu. Metoda merge() przeciez aktualizuje dane z obiektu Entity do bazy natomiast refresh aktualizuje obiekt Entity od bazy.
W ksiazce EJB 3 in action 2007 jest taki przyklad:

public Item updateItem(Item item) {
entityManager.merge(item);
return item;
}

public Item undoItemChanges(Item item) {
entityManager.refresh(entityManager.merge(item));
return item;
}
public void deleteItem(Item item) {
entityManager.remove(entityManager.merge(item));
}

O ile metoda updateItem jest oczywista to juz metoda undoItemChanges jest bledna. Przeciez jak wywolam merge(item) to dane z obiektu item zostana zapisane do bazy, potem jest refresh() czyli praktycznie nie mam co odswiezac bo bede mial to samo :D

0

Blad Twojego myslenia polega na tym ze uwazasz ze merge zapisuje cos do bazy. Otoz, merge jedyne co robi to przylacza obiekt do aktualnego persistence context*, atak aby na nastepnym flush / commit zostal automatycznie zapisany do bazy. W tym przypadku nie ma flush / commit. Autor kodu (Reza?) uzywa merge po to aby jako rezultat otrzymac nowa instancje ktora jest managed (ta przekazana jako parametr moze byc detached, i z tego co pamietam ta ksiazke to wlasnie tak jest), poniewaz tego wlasnie wymaga metoda refresh, inaczej dostaniesz wyjatek. Radze przyjrzec sie API tych dwoch metod.

  • merge dziala tak ze jesli argument jest juz managed, to zwraca ten sam obiekt, natomiast jesli jest detached, to tworzy nowy obiekt, na ktory kopiuje stan argumentu, i nastepnie zwraca ten nowy obiekt. Wniosek jest taki, ze nie zawsze to co zwroci ta metoda == argument.
0

Czyli jesli wywolam refresh(merge(item)) to zanim transakcja sie zakonczy, metoda refresh zaktualizuje obiekt Item wzgledem bazy danych i pozniejsza aktualizacja bazy wzgledem Item nie ma sensu bo beda posiadac te same wartosci tak?
Natomiast samo wywolanie merge(Item) konczy sie aktualizacja bazy. Teraz dobrze to rozumiem?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0