Newsgroup: it.comp.java
Titolo: Hibernate update best practice

Salve a tutti.
Mi trovo di fronte al seguente problema (abbastanza banale).
Leggo un dato tabellare e propongo all'utente la variazione on line di
alcuni dei dati della riga selezionata.
Ciò vuol dire che all'invio della response, quei campi che non hanno
corrispondenza con il form html e che ho letto dalla tabella andranno
persi.
Al submit, quindi, io popolo un nuovo bean che poi dovrò persistere in
update sul db.
Se io facessi ciò, però, tutti quei campi che sulla riga erano
valorizzati - e di cui io vorrei conservare il valore - andrebbero a
null perchè i corrispondenti attributi nel bean sono a null.
La mia domanda quindi è: C'è un modo migliore, oltre a quello di
salvare come hidden o in sessione i suddetti campi o scrivere la query
con hql, per far sì che gli stessi si "salvino" dall'update
conseguente?
Può essere utile usare session.merge anzichè session.update?
Grazie a chiunque risponderà.

 Grazie a chiunque risponderà.
Non so quanti ti abbiano capito, sinceramente.


Rispiego meglio.
Leggo una riga da una tabella, che ha le colonne Key, FieldA, FieldB,
FieldC e popolo il mio DTO (con attributi (key, A, B, C)).
A può essere modificabile da un utente tramite un form html.
Una volta modificato, l'utente dà submit e quello che si deve ottenere
è che la riga venga aggiornata per il valore nuovo di FieldA mentre i
valori di FieldB e FieldC devono restare invariati. Se io modifico
semplicemente il valore del corrispondente attributo (A) di un nuovo
DTO e lo passo al metodo session.update di Hibernate, quest'ultimo,
trovando a null i valori di B e C  porrà a null FieldB e FieldC,
aggiornando quindi anche questi ultimi.
Ora io so gestire la cosa lato web, ponendo in request (con campi
hidden) o in session i valori di B e C, cosicchè al submit li avrò "in
canna" per l'update.
Ma, la mia domanda è: esiste un qualche metodo di Hibernate che
aggiorna i campi di tabella i cui corrispondenti attributi nel dto da
persistere sono solo quelli diversi da null? Esiste insomma un
session.metodo(dto) che NON causi la "nullizzazione" di FieldB e
FieldC?

pio...@inwind.it
 wrote:

Non hai indicato come è implementato il form HTML... immagino che sia
input hidden key
input FieldA
da quello che capisco, rispondo :-)
meta codice per fare quello che chiedi, a seguito della request POST/GET
l'implementazione è la tradizionale pattern di update in hibernate.
DTO dto = session.load(DTO.class, key, LockMode.UPGRADE);
dto.setFieldA(fieldA);
session.saveOrUpdate(dto); // o update
puoi configurare hibernate perché vada a fare update solo sui campi
modificati, cerca class/@dynamic-update=true, leggiti la documentazione per
vedere pro/cons.
se per caso hai invece form
input hidden key
input FieldA
input FieldB
...
e non dai semantica FieldA == "" (or null) campo non modificato, allora,
banalmente
DTO dto = session.load(DTO.class, key, LockMode.UPGRADE);
boolean modified = false;
for each fieldX:
   if (fieldX != null && !fieldX.equals("")) {
      dto.setFieldX(fieldX);
      modified ||= true;
   } 
if (modified) {
   session.saveOrUpdate(dto); // o update
}
Ciao,
        Claudio

Scusate, per errore ho cancellato i primi post :-(
Ciao a Claudio e grazie per la risposta.
Ho le idee un po' più chiare ma anche un po' più confuse.
Quello che avrei voluto evitare è di fare una lettura della tabella
(oltre a quella che ovviamente avrò già fatto all'atto del caricamento
del dato per la visualizzazione) prima dell'update ma questo, a
prescindere dalla strada seguita mi pare di capire che sia
impossibile. Insomma mi sarebbe piaciuto avere un metodo (di
Hibernate, non mio) che andasse in update solo sui campi i cui
corrispondenti attributi java nel dto di riferimento non siano null.
Ma questo è stato escluso dal team di Hibernate come scritto qui:
http://forum.hibernate.org/viewtopic.php?p=1554&sid=373f68409532e76caa8dbfdf388bca00#1554
La documentazione non parla molto di pro/contro il dynamic-
update=true. In realtà mi sembra di aver capito che l'effetto finale
sia solo quello di mettere il SET solo sui campi effettivamente
modificati ma, visto che tanto li avrei comunque TUTTI in canna avendo
appena fatto previamente la lettura, non vedo cosa cambi ad avere un
SET solo su alcuni campi o ad averlo su tutti. Anche il team di
Hibernate in questo (
http://forum.hibernate.org/viewtopic.php
?
p=2172#2172)
post afferma che non è assicurato nessun miglioramento di
performance.

 SET solo su alcuni campi o ad averlo su tutti.
Ovviamente cambia di molto se attaccato ad un update hai un trigger... :-)
