Hibernate - Update bestimmter Spalten

y0dA

Erfahrenes Mitglied
Hi!

Bsp: Ich lese aus Tabelle A die Spalten a,b,c und d (es existieren aber noch weitere Spalten wie bspw. x,y und z).

Nun lade ich mir die Daten aus der Tabelle (aber nur die Spalten die ich brauche also a,b und c).
Ändere ich die Werte und danach möchte ich updaten - wie gehe ich vor?
Denn wenn ich nun folgendes mache
Code:
session.saveOrUpdate(model);
dann werden bei mir momentan auch alle anderen Felder in dem Model (beinhaltet alle Spalten, repräsentiert die Tabelle) geupdatet und in dem Fall auf NULL gesetzt -.-

Nun habe ich gesehen dass ich in den hbm.xml bei den property "update=false" setzen kann, jedoch muss es da ja noch eine bessere Möglichkeit geben?

Ich hoffe ich habe mich verständlich ausgedrückt.

Dann noch eine allgm Verständnisfrage zu Hibernate:
Was passiert eigentlich bei session.saveOrUpdate(model) oder bei session.save(model), werden hier die entsprechenden Tabelleneinträge schon geupdatet oder erst beim commit? Kann ich bspw. 5 mal ein session.saveOrUpdate(model) machen (also das model beinhaltet dann immer andere Werte) und dann nur ein commit machen?
 
hmm? Keiner eine Idee?

Betreff saveOrUpdate sowie commit, funktioniert das so:
Code:
/**
	 * update batch data <code>updateList</code>
	 * @param updateList list of models for update
	 */
	public static void updateBatchData(final List<I80050Model> updateList) {
		Session session = HibernateUtil.getCurrentSession();
		Transaction tx = null;
		try {
			 /* log info */
			I80050DB.LOGGER.info("start data update, class: I80050DB method: updateBatchData");
			tx = session.beginTransaction();
			
			for (I80050Model model : updateList) {
				/* update */
				session.saveOrUpdate(model);
			}			
			/* commit and close session */
			tx.commit();	
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			I80050DB.LOGGER.fatal(
					"class: I80050DB method: updateBatchData, exception occurred while updating data" + e);
		} finally {
			session = null;
			tx = null;
			 /* log info */
			I80050DB.LOGGER.info("end data update, class: I80050DB method: updateBatchData");
		}
	}
 
Naja, updaten tu ich genau wie du mit session.saveOrUpdate(object). Aber Probleme hatte ich damit noch nie. Weil in dem Objekt selbst steht ja die ID drin, die in der Tabelle als Primärschlüssel erzeugt worden ist (bzw. den das Hibernate erzeugt hat) und von daher macht er bei mir immer ein anständiges Update. Allerdings mach ich das immer mit Objekten, die sich aus allen Spalten der Datenbank (und vielleicht noch aus Spalten anderer Tabellen) zusammensetzen.

Kann mir aber schon gut vorstellen, dass du bei nur bestimmten Spalten da deine Probleme kriegst, insbesondere wenn der Primärschlüssel der Tabelle da nicht drin enthalten ist (oder nicht vollständig).
 
Kann mir aber schon gut vorstellen, dass du bei nur bestimmten Spalten da deine Probleme kriegst, insbesondere wenn der Primärschlüssel der Tabelle da nicht drin enthalten ist (oder nicht vollständig).

Hi!
Naja der Primärschlüssel ist selbstverständlich komplett enthalten, muss ich mich halt damit begnügen alle Spalten zu lesen (damit er mir nicht gelesene nicht wieder auf NULL setzt).

mfg
 
also, hibernate ist ein framework, dass das persistieren von objekten unterstützt...

demzufolge, holst du dir auch wieder das ganze objekt (also alle spalten) aus der datenbank raus, veränderst daten, speicherst zurück

ist wieder so eine sinnfrage, warum man ein objekt ganz persistiert und dann nachher nur einzelne attribute laden will
ich würd ich immer alles laden

natürlich kannst du auch nur einzelne spalten selektieren/auslesen (das hast du ja auch schon gemacht, in dem anderen threat)

und du kannst natürlich auch ein update auf einzelne spalten einer zeile machen, indem du dir wieder mittels HQL ein query zusammenbaust, so in richtung UPDATE (langitute) SET longitute = 900 WHERE id = 'id'

du kannst einzelne spalten auslesen, und genau so updaten
aber hier geht dann jegliches feature in richtung persistenz das hibernate hierfür anbietet verloren

da du bereits das ganze objekt ausliest (also alle spalten), kann ich dir nur raten:
bleib dabei


und bei save(obj) oder saveOrUpdate(obj) ==> Hibernate dokumentation

es gibt 3 zustände für objekte, transient, persistent, detachted, und div. methoden um sie vom einen in den anderen zustand zu bekommen


transient ==> persistent : save, saveOrUpdate, merge
transient <== persistent : delete

=======================================================

persistent ==> detached: evict, close, clear
persistent <== detached: update, merge, lock, saveOrUpdate

save speichert ein transientes objekt ab, persistiert es

update updated

saveOrUpdate:
bei transienten Objekt ==> save
Exception, falls ein persistentes objekt mit gleicher ID bereits existiert
transientes/abgehängtes objekt => update
==> verküpfung aus save und update

merge: (ab hibernate 3)
kopiert objekt in persitentes objekt mit gleicher ID
falls dieses nicht im speicher existiert, wird es geladen
falls es in der DB nicht existiert wird in der DB gespeichert
Referenz auf persistentes objekt wird zurückgegeben

evict: objekt wird nicht länger mit der DB synchronisiert, wird aber nicht aus der DB gelöscht

delete: objekt wird aus der DB gelöscht, bleibt aber noch im hauptspeicher vorhanden

lock: abgehängtes objekt wird persistent gemacht

clear: entfernen aller persistenten objekte aus session-cache

close: clear + freigabe der db-verbindung
 
Zuletzt bearbeitet:
Zurück