যেহেতু এটি একটি খুব সাধারণ প্রশ্ন, আমি এই নিবন্ধটি লিখেছি , যার ভিত্তিতে এই উত্তরটি ভিত্তিক।
সত্তার রাষ্ট্রের রূপান্তর
জেপিএ এসকিউএল স্টেটমেন্টগুলিতে সন্নিবেশ, আপডেট বা ডিলিটের মতো সত্তার রাষ্ট্রের রূপান্তরগুলি অনুবাদ করে।
যখন আপনি persist
কোনও সত্তা, আপনি EntityManager
স্বয়ংক্রিয়ভাবে বা ম্যানুয়ালি ফ্লাশ করা হয় তখন কার্যকর করা INSERT বিবৃতিটি নির্ধারণ করে যাচ্ছেন ।
যখন আপনি remove
কোনও সত্তা, আপনি মোছা বিবৃতিটি সময়সূচী করছেন, যা অধ্যবসায় প্রসঙ্গে প্রবর্তিত হলে কার্যকর করা হবে।
ক্যাসকেডিং সত্তা রাষ্ট্রের রূপান্তর
সুবিধার্থে, জেপিএ আপনাকে পিতা-মাতার সত্তা থেকে একের মধ্যে একের জন্য রাষ্ট্রীয় রূপান্তর প্রচার করতে দেয়।
সুতরাং, যদি আপনার কোনও পিতামাতার Post
সত্তা থাকে যা শিশু সত্তার সাথে @OneToMany
সম্পর্কিত হয় PostComment
:
comments
মধ্যে সংগ্রহ Post
সত্তা নিম্নরূপ ম্যাপ করা হয়:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Comment> comments = new ArrayList<>();
CascadeType.ALL
cascade
অ্যাট্রিবিউট JPA প্রদানকারী বলে পিতা বা মাতা থেকে সত্তা রাষ্ট্র রূপান্তরটি পাস Post
সবাইকে সত্তা PostComment
অন্তর্ভুক্ত সত্ত্বা comments
সংগ্রহ।
সুতরাং, আপনি যদি Post
সত্তাটি সরান :
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
entityManager.remove(post);
জেপিএ সরবরাহকারী PostComment
প্রথমে সত্তাটি সরিয়ে ফেলবে , এবং যখন সমস্ত শিশু সত্তা মুছে ফেলা হবে তখন এটি সত্তাটিও মুছে ফেলবে Post
:
DELETE FROM post_comment WHERE id = 1
DELETE FROM post_comment WHERE id = 2
DELETE FROM post WHERE id = 1
এতিম অপসারণ
আপনি যখন orphanRemoval
এট্রিবিউটটি সেট করেন true
, তখন জেপিএ সরবরাহকারী remove
যখন শিশু থেকে সত্তা সংগ্রহ থেকে অপসারণ করা হয় তখন একটি ক্রিয়াকলাপ নির্ধারণ করতে চলেছে ।
সুতরাং, আমাদের ক্ষেত্রে,
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
PostComment postComment = post.getComments().get(0);
assertEquals(1L, postComment.getId());
post.getComments().remove(postComment);
জেপিএ সরবরাহকারী সম্পর্কিত post_comment
রেকর্ডটি সরিয়ে ফেলছে যেহেতু সংগ্রহে PostComment
সত্তাটির আর উল্লেখ নেই comments
:
DELETE FROM post_comment WHERE id = 1
ক্যাসকেড মুছে ফেলুন
ON DELETE CASCADE
এফ কে পর্যায়ে সংজ্ঞায়িত করা হয়:
ALTER TABLE post_comment
ADD CONSTRAINT fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
ON DELETE CASCADE;
একবার আপনি এটি করেন, আপনি যদি একটি post
সারি মুছে ফেলেন:
DELETE FROM post WHERE id = 1
সম্পর্কিত সমস্ত post_comment
সত্তা ডাটাবেস ইঞ্জিন দ্বারা স্বয়ংক্রিয়ভাবে সরানো হবে। তবে আপনি ভুল করে কোনও মূল সত্তা মুছলে এটি খুব বিপজ্জনক অপারেশন হতে পারে।
উপসংহার
জেপিএ cascade
এবং orphanRemoval
বিকল্পগুলির সুবিধা হ'ল হারিয়ে যাওয়া আপডেটগুলি রোধ করতে আপনি আশাবাদী লকিং থেকেও উপকার পেতে পারেন ।
আপনি যদি জেপিএ ক্যাসকেডিং মেকানিজম ব্যবহার করেন, আপনার ডিডিএল-স্তর ব্যবহার করার দরকার নেই যা আপনি ON DELETE CASCADE
একাধিক স্তরে বহু শিশু সত্তা মূলের সত্তা সরিয়ে ফেললে খুব বিপজ্জনক ক্রিয়াকলাপ হতে পারে।