Mga posibleng opsyon sa status ng object

Tulad ng maaaring napansin mo, kapag ang isang bagay ay naka-attach sa Hibernate, ang estado nito ay tinatawag na Persistent o Managed . Paano tama? Magpapatuloy o Pinamamahalaan?

Ito ay posible at gayon, at gayon. Ayon sa detalye ng JPA, ang isang bagay ay may Persist na estado, at ayon sa detalye ng Hibernate, ang estado nito ay tinatawag na Managed.

Sa Hibernate, ang pagtatrabaho sa database ay isinasagawa sa pamamagitan ng isang object ng uri org.hibernate.Session . Ayon sa JPA, ang klase ay dapat na tinatawag na javax.persistence.EntityManager. Ito ay hindi talagang isang malaking problema, dahil ang parehong mga uri ay mga interface.

Ang org.hibernate.Session interface ay ipinahayag tulad nito:

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

Samakatuwid, nasa interface ng Session ang lahat ng pamamaraan na nasa interface ng EntityManager . Ngunit mayroon din itong sariling, na minana nito mula sa mga naunang bersyon ng Hibernate, noong wala pang detalye ng JPA.

Ang buong sitwasyong ito ay inilarawan bilang mga sumusunod:

Tingnan natin ang lahat ng mga pamamaraan na mayroon ang interface ng session, pati na rin ang mga nuances ng kanilang trabaho.

Ang mga nuances ng persist() na pamamaraan

Kapag nagse-save ng isang bagay sa database, kailangan mong tandaan ang dalawang bagay.

Una, ang pag-save ng object ay magreresulta sa pagpapatupad ng isa sa mga SQL command: INSERT o UPDATE. Pangalawa, ang mga pagkilos na ito ay hindi magaganap kaagad pagkatapos tawagan ang pamamaraan ng bagaysession, ngunit pagkatapos lamang isara ang transaksyon.

Isaalang-alang natin ang ilang simpleng sitwasyon, halimbawa, mayroon kang klase ng User :

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=”user_name”)
    public String name;
}

I-save natin ang object nito sa database gamit ang persist() method .

User user = new User();
user.setName("Kolyan");
session.persist(user);

Ang layunin ng pamamaraang ito ay upang i-save ang isang bagong bagay sa database. Kung wala pang ganoong bagay, idaragdag ito sa database sa pamamagitan ng pagtawag sa INSERT SQL method .

Kung ang bagay ay nasa database na, walang mangyayari. Gayunpaman, posible rin ang pangatlong kaso - isang pagtatangka na i-save ang isang bagay na may Detached status sa database. Sa kasong ito, ang isang pagbubukod ay itatapon. Halimbawa:

User user = new User();
user.setName("Kolyan");
session.persist(user);

session.evict(user);     // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!

Ang mga nuances ng save() na paraan

Ang save() na paraan ay minana ng kasalukuyang Hibernate mula sa mga naunang bersyon nito. Sa kaibuturan nito, ito ay halos kapareho sa paraan ng persist() , nagdaragdag din ito ng bagong tala sa talahanayan gamit ang paraan ng INSERT. Gayunpaman, mayroon itong maraming mga kagiliw-giliw na nuances.

Una, ang pamamaraang ito ay nagbabalik ng isang halaga - ang bagong ID ng bagay . Tulad ng alam mo na, ang mga bagay ay karaniwang walang ID bago idagdag sa database at ito ay itinalaga na ng database. Kaya, ang save() na paraan ng session object ay nagbabalik ng ID na itinalaga sa naka-save na object.

Mahalaga! Ayon sa detalye ng Hibernate ID, maaari itong maging anumang serializable na bagay, hindi lamang isang numero. Maaari itong maging isang string, isang numero, isang enum, anumang bagay sa pangkalahatan na maaaring ganap na ilagay sa isang column ng isang talahanayan sa database.

Ang save() na paraan ay may Serialized na uri ng resulta, kaya ang resulta nito ay dapat i-cast sa tamang uri:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

Gayundin, ang paraan ng save() ay may ibang gawi sa kaso ng Detached state ng object. Itinuturing nitong bago ang naturang bagay at nagdaragdag lamang ng isa pang entry:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

session.evict(user); 	// detach the object from the session
Integer id2 = (Integer) session.save(user);

Magiiba ang mga variable ng id at id2. Dalawang record ang idadagdag sa talahanayan sa database, isa para sa bawat save() operation .