remove() Yöntemi ile Kaldırma

Son olarak, bir nesneyi silmeye bakalım. Prensip olarak, veritabanından nesneleri silmek çok basittir, ancak dedikleri gibi, nüanslar vardır. Ve böyle altı nüans var:

  • remove() Yöntemi ile Kaldırma
  • Şirket için çıkarma
  • Yetim Tarafından Kaldırma
  • JPQL ile sil
  • NativeQuery aracılığıyla silme
  • softDeleted()

Ve en bariz çözümle başlayacağız - remove() yöntemini çağırarak .

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.

Veritabanındaki asıl işlem, flush() yöntemi çağrıldıktan veya işlem kapatıldıktan sonra yürütülür.

Basamaklı silme

SQL çalıştığımızda, bağımlı tabloların CONSTRAINT ile yazılabileceğini hatırlıyor musunuz? Ve onlardan biri şöyle gitti:

CONSTRAINT ONDELETE REMOVE

Bunun anlamı, alt varlıkları içeren bir tablomuz varsa, ana varlık tahsis edildiğinde, tüm alt öğelerinin silinmesi gerektiğidir.

Kullanıcının kişisel bilgilerini bir yerde sakladığımızı ve veritabanında CONSTRAINT ayarını yaptığımızı ve böylece kullanıcı silindiğinde bu verilerin de silindiğini varsayalım. O zaman sadece ana nesneyi silmemiz gerekir ve tüm alt nesneler temel düzeyde silinir:

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.

Yetim Tarafından Kaldırma

Yetim kaldırma adı verilen başka bir kaldırma türü de vardır. Önceki sürüme biraz benzer. Bir alt varlık, ana varlıkla ilişkisi kesildiğinde silinir. Bu durumda, ana varlık genellikle silinmez.

Diyelim ki bir kullanıcımız var ve onun bir gönderi listesi var:

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

Ayrıca önemli bir nüans var, eğer Hibernate'in bu davranışı uygulamasını istiyorsak, ek açıklamaları kullanarak iki varlığı bağlarken açıkça belirtilmelidir:

@Entity
public class User {

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

}

JPQL ile sil

Bir nesneyi silmenin başka bir ilginç yolu da HQL (veya JPQL) sorgusu yazmaktır. En sonunda executeUpdate() yöntemini çağırmayı unutmayın , aksi takdirde Hibernate salt okunur bir işlem oluşturur ve herhangi bir silme işlemi almazsınız.

Örnek:

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

Veritabanını değiştirmek, mevcut Entity nesnelerini hiçbir şekilde değiştirmeyecektir.

NativeQuery aracılığıyla silme

Benzer şekilde, NativeQuery'yi silebilir ve arayabilirsiniz.

Örnek:

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

Veritabanındaki değişiklik, mevcut Entity nesnelerini hiçbir şekilde etkilemeyecektir.

Geçici silme

Bazen, veritabanındaki verileri silmek yerine, basitçe silinmiş olarak işaretlemek daha uygundur. Bu tür veriler daha sonra çeşitli senaryolara katılabilir. İlk olarak, böyle bir silme kolayca geri alınabilir - satırlar yeniden canlı olarak işaretlenebilir.

İkincisi, bu tür uzak verileri "arşivlemek" yararlıdır, çünkü sunucunun davranışının kanunla düzenlendiği durumlar vardır. Ancak, verilerinizi silindi olarak işaretlerseniz, silindiğini yalnızca siz bileceksiniz. Hazırda Bekletme, bu verileri yine de bulur ve sıralama sırasında da kullanır.

Bu nedenle, Hibernate'in yaratıcıları, nesneleri canlı olarak işaretlemenin mümkün olacağı özel bir açıklama buldu. Örnek:

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

Bir nesneyi silinmiş olarak işaretlemek için, üzerinde softDeleted() yöntemini çağırmanız yeterlidir :

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