Mengalih keluar dengan Kaedah remove().

Akhir sekali, mari kita lihat pada pemadaman objek. Pada dasarnya, memadam objek dari pangkalan data adalah sangat mudah, tetapi seperti yang mereka katakan, terdapat nuansa. Dan terdapat enam nuansa seperti itu:

  • Mengalih keluar dengan Kaedah remove().
  • Penyingkiran untuk syarikat
  • Pembuangan oleh Yatim
  • Padam dengan JPQL
  • Pemadaman melalui NativeQuery
  • softDeleted()

Dan kita akan mulakan dengan penyelesaian yang paling jelas - memanggil kaedah remove() .

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 sebenar dalam pangkalan data akan dilaksanakan selepas kaedah flush() dipanggil atau transaksi ditutup.

Padam secara berperingkat

Adakah anda masih ingat semasa kita mempelajari SQL, jadual bergantung boleh ditulis dengan KEKANGAN. Dan salah seorang daripada mereka pergi seperti ini:

CONSTRAINT ONDELETE REMOVE

Maksudnya ialah jika kita mempunyai jadual yang mengandungi entiti anak, maka apabila entiti induk diperuntukkan, semua anak-anaknya mesti dipadamkan.

Katakan kami menyimpan maklumat peribadi pengguna di suatu tempat dan menyediakan KEKANGAN dalam pangkalan data supaya apabila pengguna dipadamkan, data ini juga dipadamkan. Kemudian kita hanya perlu memadamkan objek induk dan semua objek anak akan dipadamkan pada peringkat asas:

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.

Pembuangan oleh Yatim

Terdapat juga satu lagi jenis penyingkiran yang dipanggil penyingkiran Orphan. Ia agak serupa dengan versi sebelumnya. Entiti anak dipadamkan apabila hubungannya dengan entiti induk terputus. Dalam kes ini, entiti induk biasanya tidak dipadamkan.

Katakan kita mempunyai pengguna dan dia mempunyai senarai siaran:

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

Terdapat juga nuansa penting, jika kita mahu Hibernate melaksanakan tingkah laku ini, ia mesti dinyatakan secara eksplisit apabila memautkan dua entiti menggunakan anotasi:

@Entity
public class User {

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

}

Padam melalui JPQL

Satu lagi cara menarik untuk memadam objek ialah menulis pertanyaan HQL (atau JPQL). Cuma jangan lupa untuk memanggil kaedah executeUpdate() pada akhir , jika tidak Hibernate mencipta transaksi baca sahaja dan anda tidak akan mendapat sebarang pemadaman.

Contoh:

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();

Menukar pangkalan data tidak akan mengubah objek Entiti sedia ada dalam apa jua cara.

Pemadaman melalui NativeQuery

Begitu juga, anda boleh memadam dan memanggil NativeQuery.

Contoh:

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();

Perubahan dalam pangkalan data tidak akan menjejaskan objek Entiti sedia ada dalam apa jua cara.

Padam lembut

Kadangkala, daripada memadamkan data dalam pangkalan data, lebih mudah untuk menandakannya sebagai telah dipadamkan. Data sedemikian kemudiannya boleh mengambil bahagian dalam pelbagai senario. Pertama, pemadaman sedemikian mudah diterbalikkan - baris sekali lagi boleh ditandakan sebagai langsung.

Kedua, adalah berguna untuk "mengarkibkan" data jauh tersebut, kerana terdapat kes apabila tingkah laku pelayan dikawal oleh undang-undang dan sebagainya. Walau bagaimanapun, jika anda menandakan data anda sebagai dipadam, maka hanya anda yang akan tahu bahawa ia telah dipadamkan. Hibernate masih akan mencari data ini dan juga menggunakannya semasa mengisih.

Oleh itu, pencipta Hibernate menghasilkan anotasi khas yang boleh menandakan objek sebagai hidup. Contoh:

@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
    }
}

Untuk menandakan objek sebagai dipadam, anda hanya perlu memanggil kaedah softDeleted() padanya :

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