যেহেতু এই প্রশ্নটি খুব সাধারণ, এই উত্তরটি আমার ব্লগে আমার লেখা নিবন্ধের উপর ভিত্তি করে ।
ক্যাসকেডটাইপ। পুনরুদ্ধার করুন
CascadeType.REMOVEকৌশল, যা আপনি স্পষ্টভাবে কনফিগার করতে পারেন:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
বা CascadeType.ALLকৌশল থেকে স্পষ্টতই উত্তরাধিকারী :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
আপনাকে removeঅভিভাবক সত্তা থেকে তার শিশু সত্তায় অপারেশন প্রচার করতে দেয় allows
সুতরাং, আমরা যদি সংগ্রহের সাথে প্যারেন্ট Postসত্তাটি আনা করি commentsএবং postসত্তাটি সরিয়ে ফেলি:
Post post = entityManager.createQuery("""
select p
from Post p
join fetch p.comments
where p.id = :id
""", Post.class)
.setParameter("id", postId)
.getSingleResult();
entityManager.remove(post);
হাইবারনেট তিনটি মুছে ফেলা বিবৃতি কার্যকর করতে চলেছে:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
PostCommentশিশু সত্ত্বা কারণে মোছা হয়েছে CascadeType.REMOVEকৌশল, যা আমরা যদি সন্তান সত্ত্বা হিসাবে ভাল মুছে অভিনয় করেন।
এতিম সরানোর কৌশল
এতিম-অপসারণ কৌশলটি, যা বিশিষ্টতার মাধ্যমে সেট করা দরকার orphanRemoval:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
সংগ্রহ থেকে শিশু সত্তা অপসারণ করার পরে আপনাকে চাইল্ড টেবিল সারি সরানোর অনুমতি দেয়।
সুতরাং, আমরা যদি Postসত্ত্বাকে এর commentsসংগ্রহের সাথে লোড করি এবং সংগ্রহ PostCommentথেকে প্রথমটি সরিয়ে commentsফেলি:
Post post = entityManager.createQuery("""
select p
from Post p
join fetch p.comments c
where p.id = :id
order by p.id, c.id
""", Post.class)
.setParameter("id", postId)
.getSingleResult();
post.remove(post.getComments().get(0));
হাইবারনেট সম্পর্কিত post_commentটেবিল সারিটির জন্য একটি মোছা বিবৃতি কার্যকর করতে চলেছে :
DELETE FROM post_comment
WHERE id = 2
এই বিষয় সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটিও পরীক্ষা করে দেখুন ।