যেহেতু এই প্রশ্নটি খুব সাধারণ, এই উত্তরটি আমার ব্লগে আমার লেখা নিবন্ধের উপর ভিত্তি করে ।
ক্যাসকেডটাইপ। পুনরুদ্ধার করুন
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
এই বিষয় সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটিও পরীক্ষা করে দেখুন ।