Menghapus dengan metode remove()

Akhirnya, mari kita lihat menghapus objek. Pada prinsipnya, menghapus objek dari database sangat sederhana, tetapi seperti yang mereka katakan, ada perbedaannya. Dan ada enam nuansa seperti itu:

  • Menghapus dengan metode remove()
  • Penghapusan untuk perusahaan
  • Pembuangan oleh Yatim Piatu
  • Hapus dengan JPQL
  • Penghapusan melalui NativeQuery
  • softDeleted()

Dan kita akan mulai dengan solusi yang paling jelas - memanggil metode 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 aktual dalam database akan dieksekusi setelah metode flush() dipanggil atau transaksi ditutup.

Penghapusan berjenjang

Apakah Anda ingat ketika kami mempelajari SQL, tabel dependen dapat ditulis dengan CONSTRAINT. Dan salah satunya seperti ini:

CONSTRAINT ONDELETE REMOVE

Artinya, jika kita memiliki tabel yang berisi entitas anak, maka saat entitas induk dialokasikan, semua anaknya harus dihapus.

Misalkan kita menyimpan informasi pribadi pengguna di suatu tempat dan menyiapkan CONSTRAINT di database sehingga saat pengguna dihapus, data ini juga dihapus. Kemudian kita hanya perlu menghapus objek induk dan semua objek anak akan dihapus pada level 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.

Pembuangan oleh Yatim Piatu

Ada juga jenis penghapusan lain yang disebut penghapusan Orphan. Ini agak mirip dengan versi sebelumnya. Entitas anak dihapus saat hubungannya dengan entitas induk terputus. Dalam hal ini, entitas induk biasanya tidak dihapus.

Katakanlah kita memiliki pengguna dan dia memiliki daftar postingan:

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

Ada juga nuansa penting, jika kita ingin Hibernasi menerapkan perilaku ini, maka harus ditentukan secara eksplisit saat menautkan dua entitas menggunakan anotasi:

@Entity
public class User {

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

}

Hapus melalui JPQL

Cara lain yang menarik untuk menghapus objek adalah dengan menulis kueri HQL (atau JPQL). Jangan lupa untuk memanggil metode executionUpdate() di bagian akhir , jika tidak, Hibernate akan membuat transaksi hanya-baca dan Anda tidak akan mendapatkan penghapusan apa pun.

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

Mengubah database tidak akan mengubah objek Entitas yang ada dengan cara apa pun.

Penghapusan melalui NativeQuery

Demikian pula, Anda dapat menghapus 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 database tidak akan memengaruhi objek Entitas yang ada dengan cara apa pun.

Hapus lembut

Kadang-kadang, alih-alih menghapus data dalam database, lebih mudah untuk menandainya sebagai dihapus. Data tersebut kemudian dapat berpartisipasi dalam berbagai skenario. Pertama, penghapusan seperti itu mudah dibalik - garis dapat kembali ditandai sebagai hidup.

Kedua, berguna untuk "mengarsipkan" data jarak jauh tersebut, karena ada kasus ketika perilaku server diatur oleh hukum dan sejenisnya. Namun, jika Anda menandai data Anda sebagai dihapus, maka hanya Anda yang tahu bahwa itu telah dihapus. Hibernasi masih akan menemukan data ini dan juga menggunakannya saat menyortir.

Oleh karena itu, pencipta Hibernate datang dengan anotasi khusus yang memungkinkan untuk menandai 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 menandai objek sebagai dihapus, Anda hanya perlu memanggil metode softDeleted() di atasnya :

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