হাইবারনেট: সেশন.গেট এবং সেশন.লোডের মধ্যে পার্থক্য


88

এপিআই থেকে, আমি দেখতে পেলাম যে এটির প্রক্সিটির সাথে কিছু করার আছে। তবে আমি প্রক্সিতে প্রচুর তথ্য খুঁজে পাইনি session.getএবং কলিং এবং এর মধ্যে পার্থক্য বুঝতে পারি না session.load। কেউ দয়া করে আমাকে কোনও রেফারেন্স পৃষ্ঠাতে ব্যাখ্যা করতে বা নির্দেশ করতে পারে?

ধন্যবাদ!!

উত্তর:


117

থেকে হাইবারনেট ফোরাম :

এটি হাইবারনেট ইন অ্যাকশন বইটি থেকে। ভাল এটি পড়ুন ..


সনাক্তকারী দ্বারা অবজেক্টগুলি পুনরুদ্ধার করা নিম্নলিখিত হাইবারনেট কোড স্নিপেট ডাটাবেস থেকে একটি ব্যবহারকারী অবজেক্ট পুনরুদ্ধার করে:

User user = (User) session.get(User.class, userID);

গেট () পদ্ধতিটি বিশেষ কারণ শনাক্তকারী অনন্যভাবে কোনও শ্রেণীর একক উদাহরণ সনাক্ত করে। সুতরাং অবিচ্ছিন্ন অবজেক্টের জন্য সুবিধাজনক হ্যান্ডেল হিসাবে সনাক্তকারী ব্যবহার করা অ্যাপ্লিকেশনগুলির পক্ষে সাধারণ। সনাক্তকারী দ্বারা পুনরুদ্ধার কোনও বস্তু পুনরুদ্ধার করার সময় ক্যাশে ব্যবহার করতে পারে, বস্তুটি ইতিমধ্যে ক্যাশে থাকলে ডাটাবেস হিট এড়ানো। হাইবারনেট একটি লোড () পদ্ধতিও সরবরাহ করে:

User user = (User) session.load(User.class, userID);

লোড () পদ্ধতিটি পুরানো; get () ব্যবহারকারীর অনুরোধের কারণে হাইবারনেটের API এ যুক্ত হয়েছিল। পার্থক্যটি তুচ্ছ:

লোড () যদি ক্যাশে বা ডাটাবেসে বস্তুটি খুঁজে না পায় তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে। লোড () পদ্ধতিটি কখনই শূন্য হয় না। বস্তুটি খুঁজে পাওয়া না গেলে get () পদ্ধতিটি শূন্য দেয়।

লোড () পদ্ধতিটি প্রকৃত অবিচলিত উদাহরণগুলির পরিবর্তে প্রক্সি ফিরিয়ে দিতে পারে। প্রক্সি হ'ল একটি স্থানধারক যা প্রথমবার অ্যাক্সেস করার পরে আসল বস্তুর লোডকে ট্রিগার করে; অন্যদিকে, পান () কখনই প্রক্সি ফেরত দেয় না। () এবং লোড () এর মধ্যে চয়ন করা সহজ: আপনি যদি নিশ্চিত হন যে অবিচ্ছিন্ন বস্তুটি বিদ্যমান এবং অস্তিত্বকে ব্যতিক্রমী হিসাবে বিবেচনা করা হবে, তবে লোড () একটি ভাল বিকল্প। আপনি যদি নিশ্চিত না হন যে প্রদত্ত শনাক্তকারীটির সাথে একটি অবিরাম উদাহরণ রয়েছে, get () ব্যবহার করুন এবং এটি বাতিল কিনা তা দেখতে রিটার্ন মানটি পরীক্ষা করুন। লোড () ব্যবহার করে আরও জড়িত থাকে: অ্যাপ্লিকেশনটির অবিরাম পরিস্থিতি পুনরুদ্ধার করতে ডাটাবেসকে আঘাত না করেই স্থির দৃষ্টান্তে একটি বৈধ রেফারেন্স (প্রক্সি) পেতে পারে। সুতরাং লোড () ক্যাশে বা ডাটাবেসে স্থির বস্তুটি না পেলে ব্যতিক্রম ছুঁড়ে না ফেলে; প্রক্সিটি অ্যাক্সেস করা হলে ব্যতিক্রমটি পরে নিক্ষেপ করা হবে। অবশ্যই, সনাক্তকারী দ্বারা কোনও জিনিস পুনরুদ্ধার করা স্বেচ্ছাসেবী ক্যোয়ারীগুলি ব্যবহার করার মতো নমনীয় নয়।


4
আমি এখনই একটি ইস্যু ডিবাগ করছি যেখানে সেশনটি।
কেন্ট বুগার্ট

7
অনেক ধন্যবাদ! আমার জন্য অর্থের অংশটি ছিল: "লোড () যদি ক্যাশে বা ডাটাবেসের মধ্যে অবজেক্টটি না খুঁজে পায় তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয় the বস্তুটি সন্ধান না করা হলে গিটার () পদ্ধতিটি বাতিল হয়ে যায়" "
ক্রিস

15
জাভডোক ফর সেশন.জেট বলেছেন: প্রদত্ত সত্তা শ্রেণীর ক্রমাগত দৃষ্টান্ত প্রদত্ত সনাক্তকারীর সাথে প্রত্যাবর্তন করুন বা যদি এমন ধ্রুবক উদাহরণ না থাকে তবে শূন্য করুন। (উদাহরণস্বরূপ, বা প্রক্সিটির প্রক্সি যদি ইতিমধ্যে সেশনের সাথে জড়িত থাকে তবে সেই উদাহরণটি বা প্রক্সিটি ফেরত দিন)) সুতরাং বইয়ের যে বিভাগটি বলে যে: "অন্যদিকে, () কখনই প্রক্সি ফেরত দেয় না" " সঠিক নয়.
ভিকি

আপনি যদি আপনার দাওসের সাথে লেনদেন পরিচালনার কৌশল ব্যবহার করেন তবে আপনি () পেতে পছন্দ করতে পারেন। অন্যথায় কলকারীকে একটি প্রক্সি ফেরত দেওয়ার ক্ষেত্রে লোড হাইবারনেট সেশনের প্রসঙ্গেও কার্যকর করতে হবে exec উদাহরণস্বরূপ, আপনি যদি এমভিসি করছেন, আপনার নিয়ামকটি ডও.লোড () চালিয়ে দিতে পারে এবং তারপরে বৈধ সেশন না থাকলে পরে প্রক্সি অবজেক্টটি অ্যাক্সেস করার চেষ্টা করার সময় একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে। dao.get () করণটি অধিবেশন নির্বিশেষে নিয়ন্ত্রণকারীর কাছে আসল বস্তুটি ফিরিয়ে দেবে (ধরে নিলে এটি বিদ্যমান)
দেব

@ ভিকি বর্ণিত যে সমস্যাটি মাথা ব্যাথার কারণ হতে পারে এবং আমি এর কোনও সুবিধা দেখতে পাচ্ছি না। কিছু ক্ষেত্রে আমার আরও প্যারামাইট্রাইজড কোয়েরিগুলির জন্য সনাক্তকারী প্রয়োজন। তবে যেহেতু বস্তুর একটি প্রক্সি ইতিমধ্যে অধিবেশনে রয়েছে, শনাক্তকারীটির প্রাপ্তকারীটি বাতিল হয়ে যায়। যদি প্রক্সিটি অধিবেশনটিতে থাকে তবে প্রকৃত উদাহরণের পরিবর্তে তারা প্রক্সিটি পুনরুদ্ধার করবেন কেন?
djmj

15

ভাল, কমপক্ষে নিবারনেটে, সেশন.গেট (আইডি) ডাটাবেস থেকে বস্তুটি লোড করবে, যখন সেশন.লড (আইডি) কেবল আপনার সার্ভারটি ছাড়াই এটিতে একটি প্রক্সি অবজেক্ট তৈরি করে। আপনার POCOs (বা POJOs :) এ ঠিক যেমন অন্যান্য অলস বোঝা সম্পত্তি হিসাবে কাজ করে। এরপরে আপনি এই প্রক্সিটি সম্পর্ক তৈরি করতে নিজেই বস্তুর রেফারেন্স হিসাবে ব্যবহার করতে পারেন etc.

এটিকে এমন আইটেমের মতো ভাবেন যা কেবল আইডি রাখে এবং এটি আপনার প্রয়োজন হলে বাকী লোড করবে। আপনি যদি সম্পর্ক তৈরি করতে কেবল এটিকে পাশ কাটিয়ে থাকেন (যেমন এফকে), আপনার প্রয়োজন হয় এমন সমস্ত আইডি।


সুতরাং আপনি বলতে চান লোড (আইডি) প্রথমে ডাটাবেসটিকে হিট করবে এটি বৈধ আইডি কিনা তা যাচাই করে এবং তার চেয়ে প্রক্সি অবজেক্টটি ফেরত দেবে এবং যখন এই বস্তুর বৈশিষ্ট্যগুলি অ্যাক্সেস করা হয় তখন এটি আবার ডাটাবেসকে হিট করে? এটি একটি অসম্ভব পরিস্থিতি? দুটি প্রশ্ন একক বস্তু লোড করতে?
ফয়সালভাগত

না, লোড (আইডি) আইডিটিকে কোনওভাবেই বৈধতা দেবে না তাই ডিবিতে কোনও রাউন্ড-ট্রিপ হবে না। এটি তখনই ব্যবহার করুন যখন আপনি নিশ্চিত হন যে এটি বৈধ।
জর্জে আলভেস

9

সেশন.লোড () সর্বদা ডেটাবেসকে আঘাত না করে একটি "প্রক্সি" (হাইবারনেট শব্দ) প্রদান করবে। হাইবারনেটে, প্রক্সি প্রদত্ত শনাক্তকারী মান সহ একটি বস্তু, এর বৈশিষ্ট্যগুলি এখনও আরম্ভ করা হয়নি, এটি কেবল অস্থায়ী জাল বস্তুর মতো দেখায়। যদি কোনও সারি পাওয়া যায় না, তবে এটি একটি অবজেক্টনটফাউন্ডএক্সসেপশন ছুড়ে দেবে।

সেশন.জেট () সর্বদা ডাটাবেসটিকে হিট করে প্রকৃত অবজেক্টটি ফেরত দেয়, এমন একটি বস্তু যা প্রক্সি নয়, ডাটাবেস সারিটি উপস্থাপন করে। যদি কোনও সারি পাওয়া যায় না, তবে এটি নালায় ফিরে আসে।

এই পদ্ধতিগুলির সাথে পারফরম্যান্সও পৃথক করে তোলে। দু'জনের মধ্যে ...


Mkyong.com/hibernate/… তে একই কথা বলা (তবে আমি জানি না কে প্রথম ছিল)
বিশ

3

আরও একটি অতিরিক্ত পয়েন্ট ::

হাইবারনেট এর পদ্ধতিটি পান ডেটাবেস এবং ক্যাশে তে বস্তুটি পাওয়া না গেলে সেশন ক্লাসটি বাতিল করে দেয়। লোড () পদ্ধতিটি অবজেক্টনটফাউন্ডএক্সসেপশন নিক্ষেপ করে যদি বস্তুটি ক্যাশে পাশাপাশি ডাটাবেসে পাওয়া যায় না তবে কখনই শূন্য হয় না।


2

"পেতে" পরিবর্তে "লোড" ব্যবহারের একটি অপ্রত্যক্ষ পরিণতি হ'ল সংস্করণ বৈশিষ্ট্যটি ব্যবহার করে আশাবাদী লক করা আপনার প্রত্যাশার মতো কাজ করতে পারে না। যদি কোনও লোড সহজভাবে একটি প্রক্সি তৈরি করে এবং ডাটাবেস থেকে না পড়ে, সংস্করণ বৈশিষ্ট্যটি লোড হয় না। সংস্করণটি কেবল তখনই লোড হবে / আপনি যদি পরে কোনও বস্তুর কোনও সম্পত্তি উল্লেখ করেন, কোনও নির্বাচনকে ট্রিগার করে। ইতিমধ্যে, অন্য সেশনটি অবজেক্টটি আপডেট করতে পারে এবং আপনার সেশনে এটির আসল সংস্করণ থাকবে না যা এটি আশাবাদী লক চেক করা দরকার - সুতরাং আপনার সেশনের আপডেটটি কোনও সতর্কতা ছাড়াই অন্য সেশনের আপডেটটি ওভাররাইট করে দেবে।

একই শনাক্তকারীর সাথে কোনও বস্তুর সাথে দুটি সেশন কাজ করে এই দৃশ্যটি স্কেচ করার চেষ্টা করা হচ্ছে। ডিবিতে অবজেক্টের জন্য প্রাথমিক সংস্করণ 10।

Session 1                  Session 2
---------                  ---------
Load object
Wait a while..   
                           Load object
                           Modify object property
                           [triggers db 'select' -
                            version read as 10]
                           Commit
                           [triggers db update,
                            version modified to 11]
Modify object property
  [triggers db 'select' -
  version read as 11]
Commit
  [triggers db update,
  version modified to 12]

আমরা আসল 1 এর প্রতিশ্রুতিটি একটি আশাবাদী লক ব্যতিক্রম সহ ব্যর্থ হতে চাই, তবে এটি এখানে সফল হবে।

"লোড" এর পরিবর্তে "পান" ব্যবহার করা সমস্যার আশ্বাস দেয় কারণ গেটটি তাত্ক্ষণিকভাবে একটি নির্বাচন জারি করবে, এবং আশাবাদী লক পরীক্ষার জন্য সংস্করণ নম্বরগুলি সঠিক সময়ে লোড করা হবে।


0

এছাড়াও লোড ব্যবহার করার সময় আমাদের সাবধানতা অবলম্বন করতে হবে কারণ এটি উপস্থিত না থাকলে এটি ব্যতিক্রম ঘটায়। আমাদের কেবল তখনই এটি ব্যবহার করতে হবে যখন আমরা নিশ্চিত যে সেই অবজেক্টটি বিদ্যমান।


0

একটি দুর্দান্ত ব্যাখ্যা http://www.mkyong.com/hibernate/different-between-session-get-and-session-load
সেশন.লোড () এ পাওয়া যায় :
এটি সর্বদা একটি "প্রক্সি" (হাইবারনেট শব্দ) ছাড়াই ফিরে আসবে ডাটাবেস আঘাত।
হাইবারনেটে, প্রক্সি প্রদত্ত শনাক্তকারী মান সহ একটি বস্তু, এর বৈশিষ্ট্যগুলি এখনও আরম্ভ করা হয়নি, এটি কেবল অস্থায়ী জাল বস্তুর মতো দেখায়।
এটি সর্বদা প্রদত্ত পরিচয় মান সহ একটি প্রক্সি অবজেক্ট ফিরিয়ে দেবে, এমনকি পরিচয় মানটি ডাটাবেসে উপস্থিত নেই। যাইহোক, আপনি যখন কোনও প্রক্সিটি এর ডাটাবেস থেকে তার বৈশিষ্ট্যগুলি পুনরুদ্ধার করে সূচনা করার চেষ্টা করবেন, এটি নির্বাচনী বিবৃতি দিয়ে ডাটাবেসে আঘাত করবে। যদি কোনও সারি পাওয়া না যায় তবে একটি অবজেক্টনটফাউন্ডএক্সসেপশন নিক্ষেপ করবে।
সেশন.জেট ():
এটি সর্বদা ডেটাবেসকে আঘাত করে (ক্যাশে না পাওয়া গেলে) এবং প্রকৃত অবজেক্টটি ফিরিয়ে দেয়, এমন একটি বস্তু যা প্রক্সি নয়, ডাটাবেস সারিটি উপস্থাপন করে।
যদি কোনও সারি পাওয়া যায় না, তবে এটি নালায় ফিরে আসে।


0

লোড () ক্যাশে বা ডাটাবেস থেকে অবজেক্টটি সন্ধান করতে পারে না, একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয় এবং লোড () পদ্ধতিটি কখনই শূন্য হয় না।

(বস্তুটি সন্ধান না করা হলে get) পদ্ধতিটি শূন্য দেয় returns লোড () পদ্ধতিটি প্রকৃত ধ্রুবক উদাহরণের পরিবর্তে প্রক্সি ফিরিয়ে আনতে পারে () কখনই প্রক্সি ফেরত দেয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.