Omet navegació

8.2 - Estats d'un objecte Hibernate

Els objectes de les classes que Hibernate ens ha ajudat a crear poden estar en més d'un estat, si mirem la seua sincronització amb la Base de Dades:

  • Transitori: quan l'objecte s'ha creat, però no s'ha associat a cap sessió. És a dir, ja s'ha creat amb la creació de l'objecte i potser estiga buit o no (ja se li ha posat algun valor a alguna propietat), però encara no s'ha associat a cap sessió. Es podrà associar per exemple amb save() per a guardar l'objecte com hem vist en l'exemple de l'apartat anterior, o per exemple amb load(), com havíem vist en exemples anteriors per a agafar des de la Base de Dades.
  • Persistent: quan l'objecte ja s'ha associat amb una sessió i per tant té una representació en la Base de Dades i un valor identificador. Es pot haver guardat o carregat. Hibernate detectarà qualsevol canvi fet sobre un objecte persistent i sincronitzarà l'estat quan es complete la unitat de treball. I per a això ja s'encarregarà ell de fer els INSERT, DELETE o UPDATE en la Base de Dades. Nosaltres no ens haurem de preocupar.
  • Separat: és un objecte persistent, però que la seua sessió ha finalitzat. Es pot utilitzar, i fins i tot canviar l'estat, però no tindrà efecte aquestos canvies la Base de Dades, a no ser que es torne a associar una altra vegada amb una sessió, és a dir, si es torna a fer persistent. De fet, és una tècnica de treball, utilitzar objectes separats quan l'usuari puga estar molt de temps sense interactuar, i quan torne a interactuar, tornar a fer-lo persistent.

Anem a veure un exemple on es vegen els tres tipus d'estat. Tampoc cal que el feu vosaltres, està únicament a nivell il·lustratiu:

	val sessio = Configuration().configure().buildSessionFactory().openSession()
	val t = sessio.beginTransaction()

	val com = Comarca()				// A partir d'ací l'objecte és transitori
	com.nomC = "Columbretes"
	com.provincia = "Castelló"
	sessio.save(com)				// A partir d'ací és persistent

	t.commit()
	sessio.close()					// A partir d'ací és separat, igual es pot utilitzar,
                                    // però no estarà sincronitzat
	
	println(com.nomC + " (" + com.provincia + ")")