উত্তর:
সেশন ফ্লাশিং হাইবারনেটকে মেমরির ইন-মেমরি অবস্থাকে Session
ডাটাবেসের সাথে সিঙ্ক্রোনাইজ করতে বাধ্য করে (অর্থাত্ ডাটাবেসে পরিবর্তন লিখতে)। ডিফল্টরূপে, হাইবারনেট আপনার জন্য স্বয়ংক্রিয়ভাবে পরিবর্তনগুলি ফ্লাশ করবে:
স্পষ্টভাবে ফ্ল্যাশ করার অনুমতি Session
দেয় কিছু সূক্ষ্ম নিয়ন্ত্রণ যা কিছু পরিস্থিতিতে প্রয়োজন হতে পারে (একটি আইডি নির্ধারিত করতে, সেশনের আকার নিয়ন্ত্রণ করতে ...)।
id = session.save(obj);
এবং লেনদেন খুব পরের লাইনে প্রতিশ্রুতিবদ্ধ কিন্তু আপত্তি সংরক্ষণ করা হচ্ছে না ডিবি, কেন? 2) আমি session.save(obj);
প্রতিশ্রুতিবদ্ধ ব্যবহার করে আপত্তি সংরক্ষণ করেছি এবং ফিরে আসার সময় আমি ব্যবহার করেছি return obj.getprimaryID();
ডিজে-তে সংরক্ষণ করা হবে saved তাহলে কেন এমন আচরণ হচ্ছে?
ঠিক যেমন উপরের উত্তরে বলা হয়েছে, কল করে flush()
আমরা হাইবারনেটকে ডেটাবেজে এসকিউএল কমান্ডগুলি কার্যকর করতে বাধ্য করি। তবে কী বুঝতে পারছেন যে পরিবর্তনগুলি এখনও "প্রতিশ্রুতিবদ্ধ" নয়। সুতরাং ফ্লাশ করার পরে এবং প্রতিশ্রুতিবদ্ধ হওয়ার আগে, আপনি যদি সরাসরি ডিবি অ্যাক্সেস করেন (এসকিউএল প্রম্পট থেকে বলুন) এবং পরিবর্তিত সারিগুলি পরীক্ষা করে দেখুন, আপনি পরিবর্তনগুলি দেখতে পাবেন না।
এটি 2 এসকিউএল কমান্ড সেশন খোলার মতোই। এবং 1 সেশনে করা পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ না হওয়া পর্যন্ত অন্যদের কাছে দৃশ্যমান নয়।
আমি কেবল জানি যে যখন আমরা কল করি তখন session.flush()
আমাদের বিবৃতি ডাটাবেসে কার্যকর হয় তবে প্রতিশ্রুতিবদ্ধ হয় না।
ধরুন আমরা flush()
সেশন অবজেক্টে পদ্ধতিটি কল করি না এবং আমরা যদি কমিট পদ্ধতিটি কল করি তবে এটি অভ্যন্তরীণভাবে ডাটাবেজে বিবৃতি কার্যকর করার এবং তারপরে প্রতিশ্রুতিবদ্ধতার কাজটি করবে।
commit=flush+commit
(কার্যকারিতা ক্ষেত্রে)
সুতরাং, আমি এই সিদ্ধান্তে পৌঁছেছি যে যখন আমরা সেশন অবজেক্টে মেথড ফ্লাশ () বলি, তখন এটি কমিট হয় না তবে ডাটাবেস হিট করে কোয়েরি চালায় এবং রোলব্যাকও পায়।
প্রতিশ্রুতিবদ্ধতার জন্য আমরা লেনদেন অবজেক্টে কমিট () ব্যবহার করি।
সেশন ফ্লাশিং সেশনে থাকা ডেটা পায় যা বর্তমানে ডাটাবেসে থাকা সামগ্রীর সাথে সিঙ্ক্রোনাইজ হয়।
হাইবারনেট ওয়েবসাইটে আরও:
flush()
দরকারী, কারণ সেশনটি কখন জেডিবিসি কলগুলি কার্যকর করে সে সম্পর্কে কোনও গ্যারান্টি নেই, কেবলমাত্র যে আদেশে তারা কার্যকর করা হয় - আপনি ব্যবহার ব্যতীত flush()
।
আপনি flush
লেনদেন প্রতিশ্রুতিবদ্ধ হওয়ার পরিবর্তে বৈধতার সীমাবদ্ধতাগুলিকে জোর করে ব্যবহার করে কোনও পরিচিত জায়গায় সনাক্ত করতে এবং সনাক্ত করতে পারেন use এটি হতে পারে যে commit
কিছু ফ্রেমওয়ার্ক যুক্তি দ্বারা, ঘোষণামূলক যুক্তি, ধারক বা কোনও টেম্পলেট দ্বারা স্পষ্টভাবে ডাকা হয়। এই ক্ষেত্রে, নিক্ষিপ্ত কোনও ব্যতিক্রম ধরা এবং পরিচালনা করা কঠিন হতে পারে (এটি কোডে খুব বেশি হতে পারে)।
উদাহরণস্বরূপ, যদি আপনি save()
কোনও নতুন ইমেল ঠিকানা ঠিকানা, যা ঠিকানায় অনন্য বাধা রয়েছে, আপনি প্রতিশ্রুতি না দেওয়া পর্যন্ত ত্রুটি পাবেন না।
কলিং flush()
সারিটি সন্নিবেশ করানোর জন্য জোর করে, যদি কোনও সদৃশ থাকে তবে একটি ব্যতিক্রম ছুঁড়ে ফেলে।
তবে ব্যতিক্রমের পরে আপনাকে সেশনটি পিছনে ফিরে যেতে হবে।
আমি কেবল উপরে বর্ণিত সমস্ত উত্তরগুলি ক্লাব করতে চাই এবং সেশন.সেভ () এর সাথে ফ্লাশ () পদ্ধতিটিও যুক্ত করব যাতে আরও গুরুত্ব দেওয়া যায়
হাইবারনেট সেভ () ব্যবহার করে ডাটাবেসে সত্তা সংরক্ষণ করতে পারেন। আমরা কোনও লেনদেনের বাইরে এই পদ্ধতিটি চালিত করতে পারি, এজন্য ডেটা সংরক্ষণ করা আমার এই পদ্ধতিটি পছন্দ নয়। আমরা যদি লেনদেন ছাড়াই এটি ব্যবহার করি এবং আমাদের সত্তার মধ্যে ক্যাসকেডিং থাকে তবে সেশনটি ফ্লাশ না করা মাত্র কেবলমাত্র প্রাথমিক সত্ত্বাটি সংরক্ষণ হয়।
ফ্লাশ (): সেশনটি ফ্লাশ করতে বাধ্য করে। এটি ডাটাবেসের সাথে সেশন ডেটা সিঙ্ক্রোনাইজ করতে ব্যবহৃত হয়।
আপনি সেশন.ফ্লুশ () কল করার সময়, বিবৃতিগুলি ডাটাবেসে কার্যকর করা হয় তবে তা প্রতিশ্রুতিবদ্ধ হবে না। যদি আপনি সেশন.ফ্লুশ () না কল করেন এবং আপনি সেশন ডটমিট () কল করেন তবে অভ্যন্তরীণভাবে প্রতিশ্রুতিবদ্ধ () পদ্ধতিটি বিবৃতি কার্যকর করে এবং প্রতিশ্রুতিবদ্ধ।
সুতরাং কমিট () = ফ্লাশ + কমিট। সুতরাং সেশন.ফ্লুশ () কেবল ডাটাবেসে স্টেটমেন্টগুলি কার্যকর করে (তবে কমিট করে না) এবং স্টেটমেন্টগুলি আর স্মরণে নেই Y এটি সেশনটি ফ্লাশ করতে বাধ্য করে।
কয়েকটি গুরুত্বপূর্ণ বিষয়:
আমাদের বাইরের লেনদেনের সীমানা বাঁচানো উচিত, অন্যথায় ম্যাপযুক্ত সত্তাগুলি ডেটা অসঙ্গতির কারণে সংরক্ষণ করা হবে না। সেশনটি ফ্লাশ করা ভুলে যাওয়া খুব স্বাভাবিক কারণ এটি কোনও ব্যতিক্রম বা সতর্কতা দেয় না। ডিফল্টরূপে, হাইবারনেট আপনার জন্য স্বয়ংক্রিয়ভাবে পরিবর্তনগুলি ফ্লাশ করবে: কোনও লেনদেন করার সময় কিছু জিজ্ঞাসা কার্যকর করার আগে সেশনটি স্পষ্টভাবে ফ্লাশ করার অনুমতি দিলে সেশন কিছুটা নিয়ন্ত্রণ করতে পারে যা কিছু পরিস্থিতিতে প্রয়োজন হতে পারে (আইডি নির্ধারণের জন্য, সেশনের আকার নিয়ন্ত্রণ করতে) )
flush()
পদ্ধতি অধিবেশন ঘনিষ্ঠরূপে হাইবারনেট ঘটায়। setFlushMode()
পদ্ধতিটি ব্যবহার করে আপনি সেশনটির জন্য ফ্লাশিং মোড ব্যবহার করতে হাইবারনেটটি কনফিগার করতে পারেন । বর্তমান সেশনের জন্য ফ্লাশ মোডটি পেতে, আপনি getFlushMode()
পদ্ধতিটি ব্যবহার করতে পারেন । সেশনটি নোংরা কিনা তা পরীক্ষা করতে আপনি isDirty()
পদ্ধতিটি ব্যবহার করতে পারেন । ডিফল্টরূপে, হাইবারনেট সেশনগুলির ফ্লাশিং পরিচালনা করে।
ডকুমেন্টেশনে যেমন বলা হয়েছে:
https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/flushing/Flushing.html
অনিদ্রা
ফ্লাশিং হ'ল অন্তর্নিহিত ডাটাবেসের সাথে অধ্যবসায়ের প্রেক্ষাপটের স্থিতিকে সিঙ্ক্রোনাইজ করার প্রক্রিয়া।
EntityManager
এবং হাইবারনেটSession
পদ্ধতি একটি সেট, যার মাধ্যমে আবেদন ডেভেলপার কোনো সত্তার এর ক্রমাগত রাষ্ট্র পরিবর্তন করতে পারেন এক্সপোজ।অধ্যবসায় প্রসঙ্গটি কোনও সত্তার স্থিতির পরিবর্তনে সারিবদ্ধভাবে লেনদেনমূলক লিখনের পিছনে ক্যাশে হিসাবে কাজ করে। কোনও লিখিত-পিছনের ক্যাশের মতো, পরিবর্তনগুলি প্রথমে মেমোরিতে প্রয়োগ করা হয় এবং ফ্লাশের সময় ডাটাবেসের সাথে সিঙ্ক্রোনাইজ করা হয়। ফ্লাশ অপারেশন প্রত্যেক সত্তা স্থিতি পরিবর্তন নেয় এবং একটি থেকে এটি অনুবাদ করে
INSERT
,UPDATE
বাDELETE
বিবৃতি।ফ্লাশিং কৌশলটি বর্তমান চলমান হাইবারনেট সেশনের ফ্লাশমোড দ্বারা দেওয়া হয়েছে । যদিও জেপিএ কেবল দুটি ফ্লাশিং কৌশল (
AUTO
এবংCOMMIT
) সংজ্ঞায়িত করেছে, হাইবারনেট ফ্লাশ প্রকারের আরও বিস্তৃত বর্ণালী রয়েছে:
ALWAYS
: প্রতিটি প্রশ্নের আগে সেশনটি ফ্লাশ করে;AUTO
: এটি ডিফল্ট মোড এবং এটি প্রয়োজনীয় হলে সেশনটি ফ্লাশ করে;COMMIT
: বর্তমান ট্রানজেকশন প্রতিশ্রুতি না দেওয়া পর্যন্ত অধিবেশন ফ্লাশকে বিলম্বিত করার চেষ্টা করে, যদিও এটি অকাল সময়ের আগেও ফ্লাশ হতে পারে;MANUAL
: সেশন ফ্লাশিং অ্যাপ্লিকেশনটিতে প্রেরণ করা হয়, যাSession.flush()
দৃ pers়তা প্রসঙ্গে পরিবর্তনগুলি প্রয়োগ করতে অবশ্যই স্পষ্টভাবে কল করতে হবে ।ডিফল্টরূপে, হাইবারনেট
AUTO
ফ্লাশ মোড ব্যবহার করে যা নিম্নলিখিত পরিস্থিতিতে একটি ফ্লাশকে ট্রিগার করে:
- লেনদেন করার আগে;
- জেপিকিউএল / এইচকিউএল কোয়েরি কার্যকর করার আগে যা সারিবদ্ধ সত্তা ক্রিয়াকলাপগুলির সাথে ওভারল্যাপ করে;
- কোনও নেটিভ সিঙ্ক্রোনাইজেশন নেই এমন কোনও নেটিভ এসকিউএল কোয়েরি কার্যকর করার আগে।
কলিং EntityManager#flush
আছে পার্শ্ব প্রতিক্রিয়া । এটি উত্পন্ন আইডি মানগুলি (ক্রম মান) সহ সত্তা প্রকারের জন্য সুবিধামত ব্যবহার করা হয়: এ জাতীয় আইডি কেবল অন্তর্নিহিত স্থায়ী স্তর সহ সিঙ্ক্রোনাইজেশনের উপর উপলব্ধ। বর্তমান লেনদেন শেষ হওয়ার আগে যদি এই আইডি প্রয়োজন হয় (উদাহরণস্বরূপ লগিংয়ের উদ্দেশ্যে), সেশন ফ্লাশ করা প্রয়োজন।