হাইবারনেটে বিভিন্ন সঞ্চয় পদ্ধতির মধ্যে পার্থক্য কী?


199

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

আমি এখন পর্যন্ত যে পদ্ধতিগুলি চিহ্নিত করেছি সেগুলি হ'ল:

  • save()
  • update()
  • saveOrUpdate()
  • saveOrUpdateCopy()
  • merge()
  • persist()

উত্তর:


117

পদ্ধতিগুলি সম্পর্কে আমার বোঝার জন্য এখানে। মূলত এগুলি এপিআই- এর উপর ভিত্তি করে যদিও আমি বাস্তবে এই সমস্ত ব্যবহার করি না।

saveOrUpdate কিছু চেকের উপর নির্ভর করে কলগুলি সংরক্ষণ বা আপডেট করুন। যেমন কোনও সনাক্তকারী উপস্থিত না থাকলে সেভ বলা হয় save অন্যথায় আপডেট বলা হয়।

সংরক্ষণ করুন একটি সত্তা। কারও অস্তিত্ব না থাকলে শনাক্তকারীকে অর্পণ করবে। যদি কেউ এটি করে তবে তা মূলত একটি আপডেট করছে। সত্তার উত্পন্ন আইডি প্রদান করে।

কোনও বিদ্যমান সনাক্তকারী ব্যবহার করে সত্তাকে অবিচল থাকার প্রচেষ্টা আপডেট করুন । কোনও সনাক্তকারী উপস্থিত না থাকলে, আমি বিশ্বাস করি একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে।

saveOrUpdateCopy এটি অবচয় করা হয়েছে এবং আর ব্যবহার করা উচিত নয়। পরিবর্তে সেখানে ...

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

অব্যাহত উপরে উল্লিখিত হিসাবে, এটি ক্ষণস্থায়ী বস্তুগুলিতে ব্যবহৃত হয়। এটি উত্পন্ন আইডিটি দেয় না।


22
আমি এটিকে উত্তর হিসাবে গ্রহণ করতে চাই, তবে একটি জিনিস এখনও অস্পষ্ট: যেহেতু সংরক্ষণ () আপডেটে ফিরে আসে () যদি এই জাতীয় আইটেম উপস্থিত থাকে, তবে এটি বাস্তবে সেভরউপেট () থেকে কীভাবে আলাদা?
হেনরিক পল 9

এটি কোথায় নির্দিষ্ট করা হয়েছে, সেভটি বিচ্ছিন্ন দৃষ্টান্তগুলিতে কাজ করবে?
jrudolph

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

1
নীচে jrudolph দ্বারা উত্তর আরও সঠিক।
আজেরোল

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

116
╔══════════════╦═══════════════════════════════╦════════════════════════════════╗
    METHOD                TRANSIENT                      DETACHED            
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
                     sets id if doesn't         sets new id even if object   
    save()         exist, persists to db,        already has it, persists    
                  returns attached object     to DB, returns attached object 
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
                     sets id on object                    throws             
   persist()       persists object to DB            PersistenceException     
                                                                             
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
                                                                             
   update()              Exception                persists and reattaches    
                                                                             
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
                copy the state of object in      copy the state of obj in    
    merge()        DB, doesn't attach it,    ║      DB, doesn't attach it,    
                  returns attached object         returns attached object    
╠══════════════╬═══════════════════════════════╬════════════════════════════════╣
                                                                             
saveOrUpdate()║           as save()                       as update()         
                                                                             
╚══════════════╩═══════════════════════════════╩════════════════════════════════╝

updateএকটি ক্ষণস্থায়ী জিনিস ঠিক আছে, আমি একটি ব্যতিক্রম পেলাম না।
GMsoF

আমি যা জানি, আমরা কোনওভাবেই একটি ক্ষণস্থায়ীকে ধরে রাখতে পারি না। আমি মনে করি পার্থক্যটি বিচ্ছিন্ন এবং অধ্যবসায়ী মধ্যে হতে পারে। আমাকে সংশোধন করুন
রাম 12

এখানে অনেক ত্রুটি রয়েছে ... উদাহরণস্বরূপ 1) সংরক্ষণ () ´ একটি "সংযুক্ত বস্তু" ফিরিয়ে দেয় না, এটি theid´ ফেরত দেয়; 2) istersist () the আইডিকে সেট করার গ্যারান্টিযুক্ত নয়, এটি "ডিবিতে আপত্তি জানায়"; ...
ইউজেন লাবুন

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

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


আপনার নিজের আইডি জেনারেটর থাকলে
statementোকান

সুতরাং বিচ্ছিন্ন বস্তুর ক্ষেত্রে, সংহতকরণ একটি নির্বাচনকে ট্রিগার করবে যেখানে আপডেট হবে না?
গ্যাব

1
save() - If an INSERT has to be executed to get the identifier, then this INSERT happens immediately, no matter if you are inside or outside of a transaction. This is problematic in a long-running conversation with an extended Session/persistence context.আপনি কি দয়া করে আমাকে বলতে পারেন কোনও সেশনের বাইরে কীভাবে সন্নিবেশ ঘটতে পারে এবং কেন এটি খারাপ?
এরান মোড়াদ

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

12

এই লিঙ্কটি ভাল পদ্ধতিতে ব্যাখ্যা করে:

http://www.stevideter.com/2008/12/07/saveorupdate-versus-merge-in-hibernate/

আমাদের সকলেরই সেই সমস্যাগুলি রয়েছে যা আমরা খুব কম সময়েই কেবল মুখোমুখি হয়েছি যে যখন আমরা সেগুলি আবার দেখি, আমরা জানি আমরা এটি সমাধান করেছি, তবে কীভাবে তা মনে করতে পারি না।

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

            Session session = sessionFactory1.openSession();
            Transaction tx = session.beginTransaction();
            Item item = (Item) session.get(Item.class, new Long(1234));
            tx.commit();
            session.close(); // end of first session, item is detached

            item.getId(); // The database identity is "1234"
            item.setDescription("my new description");
            Session session2 = sessionFactory.openSession();
            Transaction tx2 = session2.beginTransaction();
            Item item2 = (Item) session2.get(Item.class, new Long(1234));
            session2.update(item); // Throws NonUniqueObjectException
            tx2.commit();
            session2.close();

এই ব্যতিক্রমটির কারণটি বোঝার জন্য, বিচ্ছিন্ন অবজেক্টগুলি এবং আপনি যখন আলাদা করা অবজেক্টে saveOrUpdate () (বা কেবল আপডেট ()) কল করেন তখন কী ঘটে তা বোঝা গুরুত্বপূর্ণ।

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

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

সম্ভাব্য খারাপ ডেটা সংরক্ষণ করার পরিবর্তে হাইবারনেট ননউইনিকঅবজেক্টএক্সসেপ্টের মাধ্যমে সমস্যাটি সম্পর্কে আমাদের জানায়।

তাহলে আমরা কী করব? হাইবারনেট 3 এ, আমরা () হাইবারনেট 2-এ, SaveOrUpdateCopy () ব্যবহার করুন merge এই পদ্ধতিটি হাইবারনেটকে অন্য বিচ্ছিন্ন দৃষ্টান্ত থেকে যে কোনও পরিবর্তন আপনি সংরক্ষণ করতে চান তার উপর অনুলিপি করতে বাধ্য করবে এবং এইভাবে সংরক্ষণের আগে মেমরির সমস্ত পরিবর্তনগুলিকে একত্রিত করে।

        Session session = sessionFactory1.openSession();
        Transaction tx = session.beginTransaction();
        Item item = (Item) session.get(Item.class, new Long(1234));
        tx.commit();
        session.close(); // end of first session, item is detached

        item.getId(); // The database identity is "1234"
        item.setDescription("my new description");
        Session session2 = sessionFactory.openSession();
        Transaction tx2 = session2.beginTransaction();
        Item item2 = (Item) session2.get(Item.class, new Long(1234));
        Item item3 = session2.merge(item); // Success!
        tx2.commit();
        session2.close();

এটা মনে রাখা গুরুত্বপূর্ণ যে মার্জটি উদাহরণের সদ্য আপডেট হওয়া সংস্করণে একটি রেফারেন্স দেয়। এটি সেশনে আইটেমটি পুনরায় পাঠাচ্ছে না। যদি আপনি উদাহরণের সাম্যতার (আইটেম == আইটেম 3) পরীক্ষা করেন তবে আপনি এই ক্ষেত্রে এটি মিথ্যা বলে দেখতে পাবেন। আপনি সম্ভবত এই জায়গা থেকে আইটেম 3 নিয়ে কাজ করতে চাইবেন।

এটাও লক্ষণীয় যে জাভা পার্সেন্টিস্ট এপিআই (জেপিএ) এর বিচ্ছিন্ন এবং পুনরায় সংযুক্ত বস্তুর ধারণা নেই এবং এটি অ্যান্টিটি ম্যানেজ.আরপিস্ট () এবং এন্টি ম্যানেজ.আরর্ম () ব্যবহার করে।

আমি সাধারণভাবে জানতে পেরেছি যে হাইবারনেট ব্যবহার করার সময়, saveOrUpdate () সাধারণত আমার প্রয়োজনের জন্য যথেষ্ট। আমার সাধারণত কেবল তখনই মার্জটি ব্যবহার করতে হয় যখন আমার কাছে একই ধরণের অবজেক্টের রেফারেন্স থাকতে পারে objects অতি সম্প্রতি, ব্যতিক্রমটির কারণটি কোডটিতে যাচাই করা হয়েছে যে রেফারেন্সটি পুনরাবৃত্তি হয়নি। আমি বৈধতার অংশ হিসাবে আমার সেশনে একই জিনিসটি লোড করছিলাম, ত্রুটির কারণ হয়েছিল।

আপনি কোথায় এই সমস্যার মুখোমুখি হয়েছেন? আপনার জন্য একত্রীকরণ কাজ করেছিল বা আপনার অন্য সমাধানের দরকার আছে? আপনি কি সর্বদা মার্জ ব্যবহার করতে পছন্দ করেন বা নির্দিষ্ট ক্ষেত্রে প্রয়োজনীয় হিসাবে এটি ব্যবহার করতে পছন্দ করেন?


ওয়েবআর্কাইভ সম্পর্কিত নিবন্ধটির লিঙ্ক, যেহেতু মূলটি উপলভ্য নয়: web.archive.org/web/20160521091122/http://www.stevideter.com:80/…
ইউজেন লাবুন

5

আসলে হাইবারনেট save()এবং persist()পদ্ধতির মধ্যে পার্থক্যটি আমরা ব্যবহার করছি জেনারেটর শ্রেণীর উপর নির্ভর করে।

যদি আমাদের জেনারেটর শ্রেণি নির্ধারিত হয়, তবে save()এবং persist() পদ্ধতির মধ্যে কোনও পার্থক্য নেই । কারণ জেনারেটর 'অ্যাসাইনড' অর্থ, প্রোগ্রামার হিসাবে আমাদের অবশ্যই ডাটাবেসে সংরক্ষণের জন্য প্রাথমিক কী মানটি দিতে হবে [আশা করি আপনি এই জেনারেটর ধারণাটি জানেন] নির্ধারিত জেনারেটর শ্রেণি ব্যতীত অন্য ক্ষেত্রে, ধরুন আমাদের জেনারেটর শ্রেণির নাম বর্ধনের অর্থ হাইবারনেট এটি নিজেই প্রাইমারি কী আইডি মানটি ডাটাবেসে ডানদিক দিয়ে দেবে [নির্ধারিত জেনারেটর ব্যতীত, হাইবারনেট কেবল প্রাথমিক কী আইডি মান মনে রাখার জন্য যত্ন নিতে ব্যবহৃত হয়], এই ক্ষেত্রে যদি আমরা কল করি save()বা persist()পদ্ধতিটি হয় তবে এটি রেকর্ডটি প্রবেশ করিয়ে দেবে সাধারণত ডাটাবেস তবে শুনুন বিষয়টি হ'ল save()পদ্ধতিটি সেই প্রাথমিক কী আইডি মানটি ফিরিয়ে দিতে পারে যা হাইবারনেট দ্বারা উত্পাদিত হয় এবং আমরা এটি দ্বারা দেখতে পারি

long s = session.save(k);

এই একই ক্ষেত্রে, persist()ক্লায়েন্টকে কোনও মান ফিরিয়ে দেবে না।


5

আমি হাইবারনেট সংরক্ষণের সমস্ত পদ্ধতির মধ্যে পার্থক্য দেখানোর জন্য একটি ভাল উদাহরণ পেয়েছি:

http://www.journaldev.com/3481/hibernate-session-merge-vs-update-save-saveorupdate-persist-example

সংক্ষেপে, উপরের লিঙ্ক অনুযায়ী:

সংরক্ষণ()

  • আমরা কোনও লেনদেনের বাইরে এই পদ্ধতিটি করতে পারি। আমরা যদি লেনদেন ছাড়াই এটি ব্যবহার করি এবং আমাদের সত্তার মধ্যে ক্যাসকেডিং থাকে, তবে আমরা সেশনটি ফ্লাশ না করে কেবলমাত্র প্রাথমিক সত্ত্বাটি সংরক্ষণ করা হবে।
  • সুতরাং, যদি প্রাথমিক অবজেক্ট থেকে ম্যাপযুক্ত অন্যান্য অবজেক্ট থাকে তবে লেনদেন করার সময় বা আমরা যখন সেশনটি ফ্লাশ করি তখন সেগুলি সংরক্ষণ হয়।

জিদ ()

  • এটি লেনদেনে সংরক্ষণ () ব্যবহার করার অনুরূপ, তাই এটি নিরাপদ এবং কোনও ক্যাসকেড করা সামগ্রীর যত্ন নেয়।

saveOrUpdate ()

  • লেনদেনের সাথে বা এটি ছাড়াও ব্যবহার করা যেতে পারে এবং সেভ () এর মতো, যদি এটি লেনদেন ছাড়াই ব্যবহার করা হয়, ম্যাপযুক্ত সত্তাগুলি সংরক্ষণ করা হবে না; সুতরাং আমরা সেশনটি ফ্লাশ করব।

  • সরবরাহ করা ডেটার উপর ভিত্তি করে অনুসন্ধানগুলি সন্নিবেশ করা বা আপডেট করা ফলাফল। ডাটাবেসে ডেটা উপস্থিত থাকলে আপডেট ক্যোয়ারী কার্যকর করা হয়।

হালনাগাদ()

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

একত্রিত করা()

  • হাইবারনেট মার্জটি বিদ্যমান মানগুলি আপডেট করতে ব্যবহার করা যেতে পারে, তবে এই পদ্ধতিটি পাস হওয়া সত্তা অবজেক্ট থেকে একটি অনুলিপি তৈরি করে তা ফেরত দেয়। প্রত্যাবর্তিত অবজেক্টটি স্থির প্রসঙ্গের অংশ এবং কোনও পরিবর্তনের জন্য ট্র্যাক করা, পাস করা অবজেক্টটি ট্র্যাক করা হয় না। এটি অন্যান্য সমস্ত পদ্ধতি থেকে মার্জ () এর সাথে প্রধান পার্থক্য।

এছাড়াও এই সমস্ত ব্যবহারিক উদাহরণের জন্য, দয়া করে উপরে উল্লিখিত লিঙ্কটি দেখুন, এটি এই সমস্ত বিভিন্ন পদ্ধতির উদাহরণ দেখায়।


3

আমি যেমন এই নিবন্ধে ব্যাখ্যা করেছি , আপনার বেশিরভাগ সময় জেপিএ পদ্ধতি এবং updateব্যাচের প্রক্রিয়াকরণ কাজের জন্য পছন্দ করা উচিত ।

একটি জেপিএ বা হাইবারনেট সত্তা নিম্নলিখিত চারটি রাজ্যের একটিতে থাকতে পারে:

  • ক্ষণস্থায়ী (নতুন)
  • পরিচালিত (অবিচলিত)
  • বিচ্ছিন্ন
  • সরানো (মুছে ফেলা)

এক থেকে অন্য রাজ্যে স্থানান্তরটি সত্ত্বা ম্যানেজার বা সেশন পদ্ধতিগুলির মাধ্যমে সম্পন্ন হয়।

উদাহরণস্বরূপ, জেপিএ EntityManagerনিম্নলিখিত সত্তার রাষ্ট্রের রূপান্তর পদ্ধতি সরবরাহ করে।

এখানে চিত্র বর্ণনা লিখুন

হাইবারনেট Sessionসমস্ত জেপিএ EntityManagerপদ্ধতি প্রয়োগ করে এবং কিছু অতিরিক্ত সত্তা রাষ্ট্রের রূপান্তর পদ্ধতি যেমন save, saveOrUpdateএবং সরবরাহ করে update

এখানে চিত্র বর্ণনা লিখুন

জিদ করা

অস্থায়ী (নতুন) থেকে পরিচালিত (বহিরাগত) এ সত্তার অবস্থার পরিবর্তন করতে আমরা ব্যবহার করতে পারি persist জেপিএ দ্বারা প্রদত্ত পদ্ধতিটিEntityManager যা হাইবারনেট দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত Session

persistপদ্ধতি ট্রিগার একটিPersistEvent যার দ্বারা পরিচালিত হয় DefaultPersistEventListenerহাইবারনেট ঘটনা শ্রোতা।

অতএব, নিম্নলিখিত পরীক্ষার কেসটি কার্যকর করার সময়:

doInJPA(entityManager -> {
    Book book = new Book()
    .setIsbn("978-9730228236")
    .setTitle("High-Performance Java Persistence")
    .setAuthor("Vlad Mihalcea");

    entityManager.persist(book);

    LOGGER.info(
        "Persisting the Book entity with the id: {}", 
        book.getId()
    );
});

হাইবারনেট নিম্নলিখিত এসকিউএল বিবৃতি উত্পন্ন করে:

CALL NEXT VALUE FOR hibernate_sequence

-- Persisting the Book entity with the id: 1

INSERT INTO book (
    author, 
    isbn, 
    title, 
    id
) 
VALUES (
    'Vlad Mihalcea', 
    '978-9730228236', 
    'High-Performance Java Persistence', 
    1
)

লক্ষ্য করুন যে বর্তমান অধ্যবসায় প্রসঙ্গে সত্তা idসংযুক্ত করার আগে নিয়োগ করা হয়েছে Book। এটির প্রয়োজন হয় কারণ পরিচালিত সত্তাগুলি একটিতে সংরক্ষণ করা হয়Map কাঠামোতে যেখানে কীটি সত্তার প্রকার এবং তার শনাক্তকারী দ্বারা তৈরি করা হয় এবং মানটি সত্তা রেফারেন্স। এই কারণেই জেপিএ EntityManagerএবং হাইবারনেট Sessionপ্রথম-স্তরের ক্যাশে হিসাবে পরিচিত।

কল করার সময় persist , সত্তাটি কেবল বর্তমানে চলমান পার্সিস্টান প্রসঙ্গে যুক্ত থাকে এবং INSERT flushডাকা না হওয়া পর্যন্ত স্থগিত করা যায় ।

একমাত্র ব্যতিক্রম হ'ল পরিচয় জেনারেটর যা এই মুহুর্তে সন্নিবেশটিকে ট্রিগার করে যেহেতু সত্তা সনাক্তকারী হিসাবে এটি পাওয়া যায় way এই কারণে, হাইবারনেট পরিচয় জেনারেটর ব্যবহার করে সত্তার জন্য সন্নিবেশগুলি ব্যাচ করতে পারে না। এই বিষয় সম্পর্কে আরও তথ্যের জন্য, চেক আউট এই নিবন্ধটি দেখুন

সংরক্ষণ

হাইবারনেট-নির্দিষ্ট save পদ্ধতিটি জেপিএর পূর্বাভাস দেয় এবং হাইবারনেট প্রকল্পের শুরু থেকেই এটি উপলব্ধ।

saveপদ্ধতি আরম্ভ করে SaveOrUpdateEventযার দ্বারা পরিচালিত হয় DefaultSaveOrUpdateEventListenerহাইবারনেট ঘটনা শ্রোতা। অতএব, saveপদ্ধতি সমতূল্য updateএবংsaveOrUpdate পদ্ধতির ।

saveপদ্ধতিটি কীভাবে কাজ করে তা দেখতে নিম্নলিখিত পরীক্ষার ক্ষেত্রে বিবেচনা করুন:

doInJPA(entityManager -> {
    Book book = new Book()
    .setIsbn("978-9730228236")
    .setTitle("High-Performance Java Persistence")
    .setAuthor("Vlad Mihalcea");

    Session session = entityManager.unwrap(Session.class);

    Long id = (Long) session.save(book);

    LOGGER.info(
        "Saving the Book entity with the id: {}", 
        id
    );
});

উপরের পরীক্ষার কেসটি চালানোর সময় হাইবারনেট নিম্নলিখিত এসকিউএল বিবৃতি উত্পন্ন করে:

CALL NEXT VALUE FOR hibernate_sequence

-- Saving the Book entity with the id: 1

INSERT INTO book (
    author, 
    isbn, 
    title, 
    id
) 
VALUES (
    'Vlad Mihalcea', 
    '978-9730228236', 
    'High-Performance Java Persistence', 
    1
)

আপনি দেখতে পাচ্ছেন, ফলাফলটি persistপদ্ধতি কলের মতো ident তবে, অসদৃশ persist,save পদ্ধতিটি সত্তা শনাক্তকারীকে দেয়।

আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন

হালনাগাদ

হাইবারনেট-নির্দিষ্ট updateপদ্ধতিটি বোঝানো হচ্ছে নোংরা চেকিং মেকানিজমকে বাইপাস করা এবং ফ্লাশের সময় কোনও সত্তা আপডেট জোর করে।

updateপদ্ধতি আরম্ভ করে SaveOrUpdateEventযার দ্বারা পরিচালিত হয় DefaultSaveOrUpdateEventListenerহাইবারনেট ঘটনা শ্রোতা। সুতরাং, updateপদ্ধতিটি saveএবংsaveOrUpdate পদ্ধতির সমান ।

updateপদ্ধতিটি কীভাবে কাজ করে তা নীচের উদাহরণটিকে বিবেচনা করে যা কোনও Bookলেনদেনে সত্তা অব্যাহত রাখে , তারপরে সত্তাটি বিচ্ছিন্ন অবস্থায় থাকা অবস্থায় এটি সংশোধন করে এবং updateপদ্ধতি কলটি ব্যবহার করে এটি এসকিউএল আপডেটের দিকে বাধ্য করে ।

Book _book = doInJPA(entityManager -> {
    Book book = new Book()
    .setIsbn("978-9730228236")
    .setTitle("High-Performance Java Persistence")
    .setAuthor("Vlad Mihalcea");

    entityManager.persist(book);

    return book;
});

LOGGER.info("Modifying the Book entity");

_book.setTitle(
    "High-Performance Java Persistence, 2nd edition"
);

doInJPA(entityManager -> {
    Session session = entityManager.unwrap(Session.class);

    session.update(_book);

    LOGGER.info("Updating the Book entity");
});

উপরের পরীক্ষার কেসটি কার্যকর করার সময় হাইবারনেট নিম্নলিখিত এসকিউএল বিবৃতি উত্পন্ন করে:

CALL NEXT VALUE FOR hibernate_sequence

INSERT INTO book (
    author, 
    isbn, 
    title, 
    id
) 
VALUES (
    'Vlad Mihalcea', 
    '978-9730228236', 
    'High-Performance Java Persistence', 
    1
)

-- Modifying the Book entity
-- Updating the Book entity

UPDATE 
    book 
SET 
    author = 'Vlad Mihalcea', 
    isbn = '978-9730228236', 
    title = 'High-Performance Java Persistence, 2nd edition'
WHERE 
    id = 1

লক্ষ্য করুন যে প্রতিশ্রুতি দেওয়ার UPDATEঠিক পূর্বে দৃistence়তা কনটেক্সট ফ্লাশ চলাকালীন মৃত্যুদন্ড কার্যকর করা হয়েছিল এবং সে কারণেইUpdating the Book entity বার্তাটি প্রথমে লগ হয়।

ব্যবহার @SelectBeforeUpdateঅপ্রয়োজনীয় আপডেটগুলি এড়াতে করা

এখন, আপডেট আপডেট সর্বদা কার্যকর করা হবে এমনকি সত্তাটি বিচ্ছিন্ন অবস্থায় থাকা অবস্থায় পরিবর্তিত না হলেও। এটি প্রতিরোধ করতে, আপনি @SelectBeforeUpdateহাইবারনেট টীকাগুলি ব্যবহার করতে পারেন যা একটি SELECTবিবৃতি ট্রিগার করবে loaded stateযা পরে নোংরা চেকিং প্রক্রিয়া দ্বারা ব্যবহৃত হয়।

সুতরাং, আমরা যদি টীকাটি Bookদিয়ে সত্তাটি @SelectBeforeUpdateটীকায়িত করি:

@Entity(name = "Book")
@Table(name = "book")
@SelectBeforeUpdate
public class Book {

    //Code omitted for brevity
}

এবং নিম্নলিখিত পরীক্ষার কেস কার্যকর করুন:

Book _book = doInJPA(entityManager -> {
    Book book = new Book()
    .setIsbn("978-9730228236")
    .setTitle("High-Performance Java Persistence")
    .setAuthor("Vlad Mihalcea");

    entityManager.persist(book);

    return book;
});

doInJPA(entityManager -> {
    Session session = entityManager.unwrap(Session.class);

    session.update(_book);
});

হাইবারনেট নিম্নলিখিত এসকিউএল স্টেটমেন্টগুলি সম্পাদন করে:

INSERT INTO book (
    author, 
    isbn, 
    title, 
    id
) 
VALUES (
    'Vlad Mihalcea', 
    '978-9730228236', 
    'High-Performance Java Persistence', 
    1
)

SELECT 
    b.id,
    b.author AS author2_0_,
    b.isbn AS isbn3_0_,
    b.title AS title4_0_
FROM 
    book b
WHERE 
    b.id = 1

লক্ষ্য করুন যে, UPDATEহাইবারনেট নোংরা চেকিং প্রক্রিয়াটি আবিষ্কার করেছে যে সত্তাটি পরিবর্তন করা হয়নি since

SaveOrUpdate

হাইবারনেট-নির্দিষ্ট saveOrUpdateপদ্ধতিটি কেবলমাত্র একটি উপনাম saveএবং এর জন্য update

saveOrUpdateপদ্ধতি আরম্ভ করে SaveOrUpdateEventযার দ্বারা পরিচালিত হয় DefaultSaveOrUpdateEventListenerহাইবারনেট ঘটনা শ্রোতা। সুতরাং, updateপদ্ধতিটি saveএবংsaveOrUpdate পদ্ধতির সমান ।

এখন, আপনি saveOrUpdateযখন কোনও সত্তাকে অবিচল থাকতে চান বা UPDATEনীচের উদাহরণ দ্বারা চিত্রিত হিসাবে জোর করতে চান তখন আপনি ব্যবহার করতে পারেন ।

Book _book = doInJPA(entityManager -> {
    Book book = new Book()
    .setIsbn("978-9730228236")
    .setTitle("High-Performance Java Persistence")
    .setAuthor("Vlad Mihalcea");

    Session session = entityManager.unwrap(Session.class);
    session.saveOrUpdate(book);

    return book;
});

_book.setTitle("High-Performance Java Persistence, 2nd edition");

doInJPA(entityManager -> {
    Session session = entityManager.unwrap(Session.class);
    session.saveOrUpdate(_book);
});

সাবধান NonUniqueObjectException

একটা সমস্যা যে সঙ্গে ঘটতে পারে save, updateএবং saveOrUpdateযদি অধ্যবসায় প্রসঙ্গ ইতিমধ্যে একই আইডি-র এবং নিম্নলিখিত উদাহরণ হিসাবে একই ধরণের একটি সত্তা রেফারেন্স রয়েছে:

Book _book = doInJPA(entityManager -> {
    Book book = new Book()
    .setIsbn("978-9730228236")
    .setTitle("High-Performance Java Persistence")
    .setAuthor("Vlad Mihalcea");

    Session session = entityManager.unwrap(Session.class);
    session.saveOrUpdate(book);

    return book;
});

_book.setTitle(
    "High-Performance Java Persistence, 2nd edition"
);

try {
    doInJPA(entityManager -> {
        Book book = entityManager.find(
            Book.class, 
            _book.getId()
        );

        Session session = entityManager.unwrap(Session.class);
        session.saveOrUpdate(_book);
    });
} catch (NonUniqueObjectException e) {
    LOGGER.error(
        "The Persistence Context cannot hold " +
        "two representations of the same entity", 
        e
    );
}

এখন, উপরোক্ত পরীক্ষার কেসটি কার্যকর করার সময়, হাইবারনেট একটি নিক্ষেপ করতে চলেছে NonUniqueObjectExceptionকারণ দ্বিতীয়টিতে EntityManagerইতিমধ্যে Bookএকই শনাক্তকারীর সাথে একটি সত্তা রয়েছে যা আমরা পাস করেছি updateএবং পার্সিস্টি কনটেক্সট একই সত্তার দুটি উপস্থাপনা রাখতে পারে না।

org.hibernate.NonUniqueObjectException: 
    A different object with the same identifier value was already associated with the session : [com.vladmihalcea.book.hpjp.hibernate.pc.Book#1]
    at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:651)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:284)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:227)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:92)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:682)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:674)

একত্রিত করা

এড়াতে NonUniqueObjectException, আপনাকে mergeজেপিএ দ্বারা প্রদত্ত পদ্ধতিটি EntityManagerএবং হাইবারনেট দ্বারা উত্তরাধিকারসূত্রেও ব্যবহার Sessionকরা উচিত।

এই নিবন্ধে বর্ণিত হিসাবে , mergeপার্সিস্ট্যান্স প্রসঙ্গে যদি কোনও সত্তার রেফারেন্স না পাওয়া যায় তবে এটি ডাটাবেস থেকে একটি নতুন সত্তার স্ন্যাপশট নিয়ে আসে এবং এটি mergeপদ্ধতিতে পাস হওয়া বিচ্ছিন্ন সত্তার অবস্থার অনুলিপি করে ।

mergeপদ্ধতি আরম্ভ করেMergeEvent যার দ্বারা পরিচালিত হয় DefaultMergeEventListenerহাইবারনেট ঘটনা শ্রোতা।

mergeপদ্ধতিটি কীভাবে কাজ করে তা নীচের উদাহরণটিকে বিবেচনা করে যা কোনও Bookলেনদেনে সত্তা অব্যাহত থাকে , তারপরে সত্তাটি বিচ্ছিন্ন অবস্থায় থাকা অবস্থায় এটি সংশোধন করে এবং বিচ্ছিন্ন অস্তিত্বটিকে mergeএকটি পরের দৃistence়তা প্রসঙ্গে পাঠায়।

Book _book = doInJPA(entityManager -> {
    Book book = new Book()
    .setIsbn("978-9730228236")
    .setTitle("High-Performance Java Persistence")
    .setAuthor("Vlad Mihalcea");

    entityManager.persist(book);

    return book;
});

LOGGER.info("Modifying the Book entity");

_book.setTitle(
    "High-Performance Java Persistence, 2nd edition"
);

doInJPA(entityManager -> {
    Book book = entityManager.merge(_book);

    LOGGER.info("Merging the Book entity");

    assertFalse(book == _book);
});

উপরোক্ত পরীক্ষার মামলাটি চালানোর সময়, হাইবারনেট নিম্নলিখিত এসকিউএল বিবৃতি কার্যকর করে:

INSERT INTO book (
    author, 
    isbn, 
    title, 
    id
) 
VALUES (
    'Vlad Mihalcea', 
    '978-9730228236', 
    'High-Performance Java Persistence', 
    1
)

-- Modifying the Book entity

SELECT 
    b.id,
    b.author AS author2_0_,
    b.isbn AS isbn3_0_,
    b.title AS title4_0_
FROM 
    book b
WHERE 
    b.id = 1

-- Merging the Book entity

UPDATE 
    book 
SET 
    author = 'Vlad Mihalcea', 
    isbn = '978-9730228236', 
    title = 'High-Performance Java Persistence, 2nd edition'
WHERE 
    id = 1

লক্ষ্য করুন যে সত্তার রেফারেন্সটি mergeদিয়ে দেওয়া হয়েছে তা mergeপদ্ধতিটিতে আমরা যে আলাদা করেছি তার চেয়ে আলাদা ।

এখন, যদিও mergeবিচ্ছিন্ন সত্তার স্থিতি অনুলিপি করার সময় আপনার জেপিএ ব্যবহার পছন্দ করা উচিত, তবুও SELECTব্যাচ প্রসেসিংয়ের কার্য সম্পাদন করার সময় অতিরিক্ত সমস্যা হতে পারে।

এই কারণে, আপনার ব্যবহার পছন্দ করা উচিত update যখন আপনি নিশ্চিত হন যে ইতিমধ্যে চলমান দৃ .়পদ প্রসঙ্গে ইতিমধ্যে কোনও সত্তা রেফারেন্স সংযুক্ত নেই এবং পৃথক পৃথক উপাদানটি সংশোধন করা হয়েছে।

এই বিষয় সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন

উপসংহার

কোনও সত্তা অবিরত রাখতে, আপনার জেপিএ persistপদ্ধতিটি ব্যবহার করা উচিত । বিচ্ছিন্ন সত্তা রাষ্ট্র অনুলিপি করতে, mergeপছন্দ করা উচিত। updateপদ্ধতি ব্যাচ প্রসেসিং কর্ম শুধুমাত্র দরকারী। saveএবং saveOrUpdateমাত্র alias লেখা হয় updateএবং আপনি সম্ভবত সব সময়ে তাদের ব্যবহার করা উচিত নয়।

saveসত্তা ইতিমধ্যে পরিচালনা করা হলেও কিছু বিকাশকারী কল করে , কিন্তু এটি একটি ভুল এবং পরিচালিত সংস্থাগুলির জন্য, আপডেটটি স্বয়ংক্রিয়ভাবে পার্সিটি কনটেক্স ফ্ল্যাশ সময় পরিচালিত হয়।

আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন


2

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

আপনার বর্তমান সেশনের সুযোগের বাইরে (যদি বিচ্ছিন্ন মোডে থাকে) কেবল তখনই অবজেক্টটির পরিবর্তন করা উচিত।


1

নিম্নলিখিত উত্তরগুলির কোনওটিই সঠিক নয়। এই সমস্ত পদ্ধতিগুলি কেবল এক রকম বলে মনে হয়, তবে অনুশীলনে একেবারে আলাদা জিনিস করা হয়। সংক্ষিপ্ত মন্তব্য করা শক্ত। এই পদ্ধতিগুলি সম্পর্কে সম্পূর্ণ ডকুমেন্টেশনের লিঙ্ক দেওয়া ভাল: http://docs.jboss.org/hibernate/core/3.6/references/en-US/html/objectstate.html


11
নিম্নলিখিত উত্তরগুলি কেন সঠিক নয় দয়া করে আমাদের বলুন।
এরান মোরাড

0

উপরের উত্তরগুলির কোনওটিই সম্পূর্ণ নয়। যদিও লিও থোবাল্ড উত্তরটি নিকটতম উত্তর দেখায়।

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

হাইবার্নেটের সংরক্ষণের পদ্ধতিটি কখনও ব্যবহার করবেন না। ভুলে যান যে এটি আদিপুস্তকটিতেও বিদ্যমান রয়েছে!

জিদ করা

সবাই যেমন ব্যাখ্যা করেছে, পার্সিস্ট মূলত একটি সত্তাকে "ক্ষণস্থায়ী" রাষ্ট্র থেকে "পরিচালিত" স্থিতিতে স্থানান্তর করে। এই সময়ে, একটি স্ল্যাশ বা প্রতিশ্রুতি একটি সন্নিবেশ বিবৃতি তৈরি করতে পারে। কিন্তু সত্তাটি এখনও "পরিচালিত" অবস্থায় থাকবে। ফ্লাশ দিয়ে পরিবর্তন হয় না।

এই মুহুর্তে, আপনি যদি আবার "পার্সি" করেন তবে কোনও পরিবর্তন হবে না। এবং যদি আমরা কোনও অস্তিত্ব বজায় রাখার চেষ্টা করি তবে আর কোনও সংরক্ষণ হবে না।

মজা শুরু হয় যখন আমরা সত্তাটি উচ্ছেদ করার চেষ্টা করি।

উচ্ছেদ একটি হাইবারনেটের একটি বিশেষ ক্রিয়া যা "ম্যানেজড" থেকে "বিচ্ছিন্ন" তে সত্তাটি রূপান্তরিত করে। আমরা কোনও বিচ্ছিন্ন সত্তার উপর জেদ রাখতে পারি না। যদি আমরা এটি করি, তবে হাইবারনেট একটি ব্যতিক্রম উত্থাপন করে এবং সম্পূর্ণ লেনদেন প্রতিশ্রুতিবদ্ধ হয়ে ফিরে আসে।

আপডেট বনাম মার্জ করুন

এই 2 টি আকর্ষণীয় ফাংশন যখন বিভিন্ন উপায়ে ডিল করা হয় তখন বিভিন্ন জিনিস করা হয়। তারা উভয়ই সত্তাকে "বিচ্ছিন্ন" রাজ্য থেকে "পরিচালিত" অবস্থায় স্থানান্তরের চেষ্টা করছে। তবে এটি অন্যভাবে করছেন।

একটি বাস্তবতা বুঝতে পারুন যে ডিটেচড মানে "ধরণের" অফলাইন state এবং পরিচালিত মানে "অনলাইন" রাষ্ট্র।

নীচের কোডটি পর্যবেক্ষণ করুন:

Session ses1 = sessionFactory.openSession();

    Transaction tx1 = ses1.beginTransaction();

    HibEntity entity = getHibEntity();

    ses1.persist(entity);
    ses1.evict(entity);

    ses1.merge(entity);

    ses1.delete(entity);

    tx1.commit();

আপনি এই কখন করবেন? তুমি কি ভাব কি হতে পারে? আপনি যদি বলেন যে এটি ব্যতিক্রম বাড়িয়ে তুলবে, তবে আপনি সঠিক। এটি ব্যতিক্রম উত্থাপন করবে কারণ, মার্জটি সত্তা অবজেক্টে কাজ করেছে, যা পৃথক অবস্থায় রয়েছে। তবে এটি বস্তুর অবস্থার কোনও পরিবর্তন করে না।

দৃশ্যের পিছনে, মার্জটি একটি নির্বাচিত প্রশ্ন উত্থাপন করবে এবং মূলত সত্তার অনুলিপিটি সংযুক্ত অবস্থায় ফিরে আসবে returns নীচের কোডটি পর্যবেক্ষণ করুন:

Session ses1 = sessionFactory.openSession();

    Transaction tx1 = ses1.beginTransaction();
    HibEntity entity = getHibEntity();

    ses1.persist(entity);
    ses1.evict(entity);

    HibEntity copied = (HibEntity)ses1.merge(entity);
    ses1.delete(copied);

    tx1.commit();

উপরের নমুনাটি কাজ করে কারণ একীভূত হওয়া প্রসঙ্গে একটি নতুন সত্তা এনেছে যা স্থিত অবস্থায় রয়েছে।

আপডেটের সাথে প্রয়োগ করার সময় একই কাজগুলি সূক্ষ্ম হয় কারণ আপডেটটি আসলে মার্জ করার মতো সত্তার অনুলিপিটি নিয়ে আসে না।

Session ses1 = sessionFactory.openSession();

    Transaction tx1 = ses1.beginTransaction();

    HibEntity entity = getHibEntity();

    ses1.persist(entity);
    ses1.evict(entity);

    ses1.update(entity);

    ses1.delete(entity);

    tx1.commit();

একই সাথে ডিবাগ ট্রেসগুলিতে আমরা দেখতে পাই যে আপডেটগুলি মার্জ হওয়ার মতো নির্বাচনের এসকিউএল কোয়েরি উত্থাপন করেনি।

মুছে ফেলা

উপরের উদাহরণে আমি মোছার কথা না বলে মুছুন ব্যবহার করেছি। মুছুন মূলত সত্তাকে পরিচালিত রাষ্ট্র থেকে "মুছে ফেলা" স্থিতিতে স্থানান্তরিত করে। এবং যখন ফ্লাশ বা কমিট করা হয় তখন তা সংরক্ষণ করার জন্য মুছুন কমান্ড জারি করবে।

তবে অবিচলিত পদ্ধতিটি ব্যবহার করে সত্তাকে "মুছে ফেলা" অবস্থা থেকে "পরিচালিত" স্থিতিতে ফিরিয়ে আনা সম্ভব।

আশা করি উপরোক্ত ব্যাখ্যাটি কোনও সন্দেহ পরিষ্কার করেছে।

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