Mbusak kanthi cara mbusak ().

Pungkasan, ayo goleki mbusak obyek. Ing asas, mbusak obyek saka database banget prasaja, nanging lagi ngomong, ana nuansa. Lan ana enem nuansa kasebut:

  • Mbusak kanthi cara mbusak ().
  • Aman kanggo perusahaan
  • Panyingkiran dening Orphan
  • Busak nganggo JPQL
  • Pambusakan liwat NativeQuery
  • softDeleted()

Lan kita bakal miwiti karo solusi sing paling jelas - nelpon metode mbusak () .

User user = new User();
user.setName("Kolyan");
session.persist(user);  // add an object to the database
session.flush();
session.clear();  // close the session

user = (User) session.find(User.class, user.getId() ); //receive the object from the database
session.remove(user);
session.flush();
session.clear();  // close the session

//here the object is actually deleted.

Operasi nyata ing database bakal kaleksanan sawise flush () cara disebut utawa transaksi ditutup.

Cascading mbusak

Apa sampeyan ngelingi nalika sinau SQL, tabel gumantung bisa ditulis nganggo CONSTRAINT. Lan salah siji saka wong-wong mau tindak kaya mangkene:

CONSTRAINT ONDELETE REMOVE

Tegese yaiku yen kita duwe tabel sing ngemot entitas anak, banjur nalika entitas induk dialokasikan, kabeh anak kudu dibusak.

Upaminipun kita nyimpen informasi pribadhi pangguna nang endi wae lan nyetel CONSTRAINT ing database supaya nalika pangguna wis dibusak, data iki uga dibusak. Banjur kita mung kudu mbusak obyek induk lan kabeh obyek anak bakal dibusak ing tingkat dasar:

User user = new User();
UserPrivateInfo info = new UserPrivateInfo();
user.setPrivateInfo(info);
session.persist(user);  //add the object to the database, the info object will also be saved to the database
session.flush();
session.clear();  // close the session

user = (User) session.find(User.class, user.getId() ); //receive the object from the database
session.remove(user);
session.flush();
session.clear();  // close the session

// here the user and info objects are actually removed from the database.

Panyingkiran dening Orphan

Ana uga jinis penghapusan liyane sing diarani Orphan removal. Iku rada padha karo versi sadurungé. Entitas anak dibusak nalika hubungane karo entitas induk rusak. Ing kasus iki, entitas induk biasane ora dibusak.

Ayo kita duwe pangguna lan dheweke duwe dhaptar kiriman:

User user = new User();
UserMessage message = new UserMessage();
user.getMessageList().add(message);
session.persist(user);  //add the object to the database, the message object will also be saved to the database
session.flush();
session.clear();  // close the session

user = (User) session.find(User.class, user.getId() ); //receive the object from the database
UserMessage message2 = user.getMessageList().get(0); //get the user's message
user.getMessageList().remove(message2);  //remove the message from the list
session.flush();
session.clear();  // close the session

// here the message2 object is actually removed from the database

Ana uga nuansa penting, yen kita pengin Hibernate ngleksanakake prilaku iki, kudu kasebut kanthi jelas nalika ngubungake rong entitas nggunakake anotasi:

@Entity
public class User {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private List<UserMessage> messageList = new ArrayList<UserMessage>();

}

Mbusak liwat JPQL

Cara liyane sing menarik kanggo mbusak obyek yaiku nulis pitakon HQL (utawa JPQL). Cukup aja lali nelpon metode executeUpdate () ing pungkasan , yen Hibernate nggawe transaksi mung diwaca lan sampeyan ora bakal bisa mbusak.

Tuladha:

User user = new User();
session.persist(user);  // add an object to the database
session.flush();
session.clear();  // close the session

session.createQuery("delete from User where id = :id")
   .setParameter("id", user.getId())
   .executeUpdate();

Ngganti database ora bakal ngganti obyek Entitas sing ana ing sembarang cara.

Pambusakan liwat NativeQuery

Kajaba iku, sampeyan bisa mbusak lan nelpon NativeQuery.

Tuladha:

User user = new User();
session.persist(user);  // add an object to the database
session.flush();
session.clear();  // close the session

session.createNativeQuery("DELETE FROM user WHERE id = :id")
   .setParameter("id", user.getId())
   .executeUpdate();

Owah-owahan ing database ora bakal mengaruhi obyek Entitas ana ing sembarang cara.

Soft delete

Kadhangkala, tinimbang mbusak data ing basis data, luwih gampang kanggo menehi tandha minangka dibusak. Data kasebut banjur bisa melu ing macem-macem skenario. Kaping pisanan, pambusakan kasebut gampang dibalik - garis kasebut bisa ditandhani maneh minangka urip.

Kapindho, migunani kanggo "arsip" data remot kasebut, amarga ana kasus nalika prilaku server diatur dening hukum lan liya-liyane. Nanging, yen sampeyan menehi tandha yen data wis dibusak, sampeyan mung bakal ngerti yen wis dibusak. Hibernate isih bakal nemokake data iki lan uga digunakake nalika ngurutake.

Mulane, pencipta Hibernate nggawe anotasi khusus sing bisa menehi tandha obyek minangka urip. Tuladha:

@Entity
@Where(clause = "DELETED = 0") //in all WHEREs "AND DELETED = 0" will be added
public class User {
	// mapping fields

	@Column(name = "DELETED") // if the value in the DELETED column == 0, then the record is alive, if 1 - dead
	private Integer deleted = 0;

	//getters and setters

    public void softDeleted() {
    	this.deleted = 1; //mark the post as dead
    }
}

Kanggo menehi tandha obyek minangka dibusak, sampeyan mung kudu nelpon softDeleted () cara ing :

User user = new User();
session.persist(user);  // add an object to the database
session.flush();
session.clear();  // close the session

user = (User) session.find(User.class, user.getId() ); //receive the object from the database
user.softDeleted(); // mark the object as deleted
session.flush();
session.clear();  // close the session

//this object will no longer reside via Hibernate