EntityManager - inteligentny update?

EntityManager - inteligentny update?
EF
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:53
0

Cześć
Zastanawiam się czy w EntityManager merge jest możliwość podmiany całego obiektu zamiast pracochłonnego ustawiania każdego atrybutu osobno?

niezdecydowany
niezdecydowany
????? że urwa eeeeee //,, ???
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Nie rozumiem pytania. Jak dasz temu swojemu "całemu" obiektowi ID i zrobisz merge to stanie się to o co pytasz...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
EF
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:53
0
Kopiuj
@Transactional
public void editBook(Book book) {
entityManager.merge(book);
}

Mam coś takiego i zero reakcji, czy błedu czy coś. Jak mam rozumieć nadanie mojemu obiektowi ID? Book który jest przekazywany do metody posiada komplet pól łącznie z ID, możesz rozwinąć?

edytowany 1x, ostatnio: efem
niezdecydowany
niezdecydowany
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Bieszczady
0

Ale jakiej reakcji ? co sie ma stać ?


"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
EF
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:53
0

W bazie ma zostac zupdejtowany book o ID book.getId();

edytowany 1x, ostatnio: efem
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

I ja myśle że zostaje. merge() zwraca ci obiekt zsynchronizowany z bazą. Zobacz czy ten obiekt który dostajesz ma poprawnie ustawione pola. Bo przecież rozumiesz że niekoniecznie od razu wygeneruje to zapytanie do bazy, prawda? Jak chcesz sobie to wymusić do daj flush() na entitymanagerze...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
niezdecydowany
niezdecydowany
yyy ? przecież merge zwraca obiekt który jest zarządzany przez persistence context - to wszystko :D
Shalom
@niezdecydowany jasne, ale kolega nie ufa póki nie zobaczy że do bazy poszło zapytanie z update ;)
EF
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:53
0

Nie updejtuje niestety a pola są ok.

Shalom
Patrz mój edytowany post...
RA
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 8 lat
  • Postów:13
0

Mozesz jeszcze pokazac kod klasy domenowej Book.
Kolejna sprawa, jesli klasa Book ma np. takie atrybuty:

Kopiuj
Long book_id;
String title;
String author;

a Ty zrobisz sobie obiekt ktory bedzie mial tylko ustawione book_id i title to przy mergowaniu o ile sie nie myle autor zostanie ustawiony na null.
W takiej sytuacji przydaloby sie zaciagnac obiekt z bazy na podstawie book_id, zmergowac oba obiekty pomijajac nullowe wartosci i wtedy zrobic merga na bazie.

edytowany 1x, ostatnio: raker
Zobacz pozostały 1 komentarz
RA
@niezdecydowany ja napotkałem kiedyś taki problem, że korzystając z jsf miałem poprzez formularz ustawione tylko ninektóre parametry obiektu, pozostałe nie edytowane były nullami i też właśnie nulle leciały do bazy, tylko o to mi chodziło. Sytuacja z życia to np. zmiana hasła usera, gdzie edytujemy tylko hasło, pozostałe atrybuty są nullami.
niezdecydowany
niezdecydowany
bo ustawiasz NULL'a fizycznie, persistence context widzi taką zmienę i ta zmiana leci w SQLu do bazy.
EF
tutaj akurat była sytuacja, że obiekt zawsze wracał z edycji kompletny (wymagalność pól), więc nulli nie było. Problem był brak jakiegokolwiek updejtu na bazie. Flush() pomogło ale w końcu poszedłem w stronę Spring Data JPA i saveAndFlush() załatwia zarazem nowe rekordy jak i update istniejących.
RA
NIe ustawiam Nulli fizycznie tylko np. dla Stringa defaultowa wartosc to null. Oczywiscie mozna przekazac nie edytowane parametry w hiddenach, ale jak nie chce sie ich miec w formie to trzeba odpowiednio to przygotowac
niezdecydowany
niezdecydowany
ale majac obiekt JakisModel w persistence contexcie, jezeli nie zmienisz wartosci tego obiektu, to nie zostanie zapisana do bazy ...
1
raker napisał(a):

Mozesz jeszcze pokazac kod klasy domenowej Book.
Kolejna sprawa, jesli klasa Book ma np. takie atrybuty:

Long book_id;
String title;
String author;

Kopiuj
> 
> a Ty zrobisz sobie obiekt ktory bedzie mial tylko ustawione book_id i title to przy mergowaniu o ile sie nie myle autor zostanie ustawiony na null.
> W takiej sytuacji przydaloby sie zaciagnac obiekt z bazy na podstawie book_id, zmergowac oba obiekty pomijajac nullowe wartosci i wtedy zrobic merga na bazie.


Specyfikacja mówi krótko "The application must not change the value of the primary key [10] . The behavior is undefined if this occurs. [11]". Czyli jeśli wiemy, że mamy książkę o id=10 w bazie, to żeby zmienić jej tytuł nie robimy:
```java
Book book = new Book();
book.setId(10);
book.setTitle("asd");
em.merge(book);

tylko

Kopiuj
Book book = em.find(Book.class, 10); //albo getReference
book.setTitle("asd");
//em.merge(book); //juz niepotrzebne, bo po wykonaniu find book i tak jest w PersistenceContext

Mergować można z tego co pamiętam encje które są w stanie detached i zserializowane.

Sytuacja z życia to np. zmiana hasła usera, gdzie edytujemy tylko hasło, pozostałe atrybuty są nullami.

Do tego powinien być zrobiony osobny formularz (drugi na tej samej stronie). Ewentualnie ten rzadko używany feature JSF o nazwie valueChangeListener, i tam powinien być edytowany atrybut encji.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)