জাভা পার্সোনেন্স এপিআই তে ফেচটাইপ লাজি এবং ইএগ্রের মধ্যে পার্থক্য?


551

আমি জাভা পার্সিটিশন এপিআই এবং হাইবারনেট এর নবাগত।

জাভা পার্সেন্টিপি এপিআই FetchType.LAZYএবং এর FetchType.EAGERমধ্যে পার্থক্য কী ?


1
ইগ্রার সংগ্রহগুলি লোড করার অর্থ হল তাদের পিতামাতাকে আনার সময় এগুলি পুরোপুরি আনা হয়। ইগ্রার লোড করার সময়, তারপরে আমার সমস্ত বাচ্চা আনা হয়েছে। শিশুটিকে পার্সেন্টেন্টসেট এবং পার্সেন্টিস্টলিস্টে (বা পার্সেন্টিভ ব্যাগ) এনে রাখা হয়, পার্সেন্ট্যান্ট ব্যাগের ভিতরে এটি অ্যারে তালিকা হিসাবে প্রদর্শিত হয়। এটা কি ঠিক ?? ..
গীথা

উত্তর:


1063

কখনও কখনও আপনার দুটি সত্তা থাকে এবং তাদের মধ্যে একটি সম্পর্ক রয়েছে। উদাহরণস্বরূপ, আপনার কাছে একটি সত্ত্বা বলা হতে পারে Universityএবং অন্য একটি সত্ত্বা বলা Studentহতে পারে এবং একটি বিশ্ববিদ্যালয়ের অনেক শিক্ষার্থী থাকতে পারে:

বিশ্ববিদ্যালয় সত্তার কিছু প্রাথমিক বৈশিষ্ট্য থাকতে পারে যেমন আইডি, নাম, ঠিকানা ইত্যাদি well পাশাপাশি একটি শিক্ষার্থী নামে একটি সংগ্রহ সম্পত্তি যা একটি প্রদত্ত বিশ্ববিদ্যালয়ের শিক্ষার্থীদের তালিকা ফিরিয়ে দেয়:

একটি বিশ্ববিদ্যালয়ে অনেক ছাত্র থাকে

public class University {
   private String id;
   private String name;
   private String address;
   private List<Student> students;

   // setters and getters
}

এখন আপনি যখন ডাটাবেস থেকে কোনও বিশ্ববিদ্যালয় লোড করেন, জেপিএ আপনার আইডি, নাম এবং ঠিকানা ক্ষেত্রগুলি লোড করে। তবে কীভাবে শিক্ষার্থীদের বোঝাই করা উচিত তার জন্য আপনার কাছে দুটি বিকল্প রয়েছে:

  1. এটিকে বাকি ক্ষেত্রগুলির সাথে একত্রে লোড করা (অর্থাত্ আগ্রহের সাথে), বা
  2. আপনি বিশ্ববিদ্যালয়ের getStudents()পদ্ধতিটি কল করার সময় এটি অন-ডিমান্ডে (অর্থাত্ অলসভাবে) লোড করতে ।

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

এখানে একটি উদাহরণ দেওয়া হয়েছে, যেখানে studentsস্পষ্টভাবে আগ্রহীভাবে লোড হওয়ার জন্য চিহ্নিত করা হয়েছে:

@Entity
public class University {

    @Id
    private String id;

    private String name;

    private String address;

    @OneToMany(fetch = FetchType.EAGER)
    private List<Student> students;

    // etc.    
}

এবং এখানে একটি উদাহরণ রয়েছে যেখানে studentsসুস্পষ্টভাবে অলসভাবে লোড হওয়ার জন্য চিহ্নিত করা হয়েছে:

@Entity
public class University {

    @Id
    private String id;

    private String name;

    private String address;

    @OneToMany(fetch = FetchType.LAZY)
    private List<Student> students;

    // etc.
}

5
@ বেহরংসেইদজাদেহ আপনি কয়েকটি ব্যবহারিক পার্থক্য বা প্রতিটি ধরণের লোডের সুবিধা এবং অসুবিধাগুলির তালিকা করতে পারেন (আপনার উল্লেখযোগ্যতা ব্যতীত)। কেন কেউ আগ্রহী লোডিং ব্যবহার করতে চাইবে?
এডিটিসি

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

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

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

2
@JavaTechnical নির্ভর যদি আপনি দ্বিতীয় স্তর ক্যাশে সক্ষম (ডিফল্ট দ্বারা সক্ষমিত)
CED

285

মূলত,

LAZY = fetch when needed
EAGER = fetch immediately

11
খুব পরিষ্কার তবে কেবল @ বেহং এর উত্তর পড়ার পরে। পরিষ্কার সংক্ষিপ্তসার জন্য আপনাকে ধন্যবাদ। :-)
নবীন 22'16

66

EAGERসংগ্রহগুলি লোড করার অর্থ তাদের পিতামাতাকে আনার সময় এগুলি পুরোপুরি আনা হয়। তাই আপনি যদি আপনার আছে Courseএবং এটা আছে List<Student>, সব ছাত্র নিয়ে আসা হয় ডাটাবেস থেকে সময়ে Courseপেয়েছে।

LAZYঅন্যদিকে এর অর্থ হ'ল Listযখন আপনি সেগুলিতে অ্যাক্সেস করার চেষ্টা করবেন তখনই এর সামগ্রীগুলি আনবে। উদাহরণস্বরূপ, কল করে course.getStudents().iterator()। যে কোনও অ্যাক্সেস পদ্ধতিতে Listকল করা উপাদানগুলি পুনরুদ্ধার করতে ডাটাবেসে একটি কল শুরু করবে। এটি List(বা Set) এর আশেপাশে একটি প্রক্সি তৈরি করে প্রয়োগ করা হয় । সুতরাং আপনার অলস সংগ্রহের জন্য, কংক্রিটের ধরণগুলি নয় ArrayListএবং HashSet, PersistentSetএবং এবং PersistentList(বা PersistentBag)


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

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

1
@ বোজো আপনি কেবলমাত্র সংগ্রহের অলস লোডিং নির্দিষ্ট করেছেন। কোনও সরল স্ট্রিং ফিল্ডটি কি অলস বোঝাই হতে পারে?
vikiiii

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

@ বোজো, আরে আপনি দয়া করে এর উত্তর দিতে পারেন তবে যদি এটি fetchtype = LAZYডিফল্টরূপে সেট করা হয় এমনকি গিটার হাইবারনেট দিয়ে সংগ্রহ করার চেষ্টা করেও আমাকে মূল্যায়ন করতে পারে না বলে বলছে
Едно Едно

16

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


11

আমার জ্ঞান অনুযায়ী উভয় প্রকার আনয়ন আপনার প্রয়োজনীয়তা নির্ভর করে।

FetchType.LAZY চাহিদা অনুসারে (অর্থাত্ যখন আমাদের ডেটার প্রয়োজন হয়))

FetchType.EAGER তাত্ক্ষণিকভাবে (যেমন আমাদের প্রয়োজন আসার আগে আমরা অকারণে রেকর্ড আনছি)


11

ডিফল্টরূপে, সমস্ত সংগ্রহ এবং মানচিত্রের অবজেক্টের জন্য আনার নিয়ম FetchType.LAZYএবং অন্যান্য দৃষ্টান্তে এটি FetchType.EAGERনীতি অনুসরণ করে ।
সংক্ষেপে, @OneToManyএবং @ManyToManyসম্পর্কগুলি সম্পর্কিত বিষয়গুলি (সংগ্রহ এবং মানচিত্র) জড়িতভাবে আনে না তবে পুনরুদ্ধার অপারেশনটি ক্ষেত্রের মধ্যে @OneToOneএবং এর মধ্যে ক্যাসকেড করা হয় @ManyToOne

(সৌজন্যে: - অবজেক্টবিকম)


9

উভয় FetchType.LAZYএবং ডিফল্ট আনয়ন পরিকল্পনাFetchType.EAGER সংজ্ঞায়িত করতে ব্যবহৃত হয় ।

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

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


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

আপনি কি এখানে আপনার বই প্রচার করছেন !!। তবে হ্যাঁ আমি অনুভব করি এটি ব্যবহারের ক্ষেত্রে, এবং মূলতার সম্পর্কের ক্ষেত্রে অবজেক্টের আকারকে বোঝানো হচ্ছে depends
জন দো

6

জাভাডোক থেকে :

EAGER কৌশলটি দৃ pers়তা সরবরাহকারীর রানটাইমের একটি প্রয়োজনীয়তা যা ডেটা আগ্রহের সাথে আনতে হবে। অলস কৌশলটি অধ্যবসায় সরবরাহকারী রানটাইমের প্রতি ইঙ্গিত দেয় যে ডেটা যখন প্রথম অ্যাক্সেস করা হয় তখন আলস্যভাবে আনা উচিত।

যেমন, উত্সাহী অলস চেয়ে বেশি সক্রিয়। অলস কেবল প্রথম ব্যবহারে ঘটে (যদি সরবরাহকারী ইঙ্গিতটি নেয়) তবে আগ্রহী জিনিসগুলির সাথে (হয়ত) প্রাক-আনতে পারে।


1
"প্রথম ব্যবহার" বলতে কী বোঝ?
লিওন

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

@ টিজে ক্রাউডার, যখন কোনও ফেচটাইপ সংজ্ঞায়িত হয় না তখন ডিফল্টটি কী?
মাহমুদ সালেহ

@ মাহমুদসালেহ: আমার কোনও ধারণা নেই। এটি সম্ভবত কোনও কিছুর উপর ভিত্তি করে পরিবর্তিত হয়। আমি কোনও বাস্তব প্রকল্পে জেপিএ ব্যবহার করি নি তাই এটির সাহসের মধ্যে n'tোকা নি।
টিজে ক্রাউডার

2
@ মাহমুদস: ডিফল্ট ফেচটাইপস: ওয়ানটোম্যানি: লাজি, ম্যান্টিটোন: ইগর, ম্যান্টিটোম্যান: লাজি, ওয়ানটোন: ইগর, কলাম: ইগর
মার্কাস স্কিডড

5

Lazyপান টাইপ হাইবারনেট দ্বারা নির্বাচিত, যদি না আপনি স্পষ্টভাবে চিহ্নিত ডিফল্টরূপে হয় Eagerটাইপ পান। আরও নির্ভুল এবং সংক্ষিপ্ত হওয়ার জন্য, পার্থক্যটি নীচে হিসাবে বর্ণনা করা যেতে পারে।

FetchType.LAZY = যদি আপনি গেটর পদ্ধতির মাধ্যমে এটি না চান তবে এটি সম্পর্ক লোড করে না।

FetchType.EAGER = এটি সমস্ত সম্পর্ক লোড করে।

এই দুটি আনার ধরণের প্রো এবং কনস Cons

Lazy initialization অপ্রয়োজনীয় গণনা এড়িয়ে মেমরির প্রয়োজনীয়তাগুলি হ্রাস করে কর্মক্ষমতা উন্নত করে।

Eager initialization আরও মেমরি খরচ লাগে এবং প্রক্রিয়াকরণের গতি ধীর হয়।

এই কথাটি বলার পরে, পরিস্থিতির উপর নির্ভর করে যে কোনও একটি এই আরম্ভের ব্যবহার করা যেতে পারে।


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

3

Book.java

        import java.io.Serializable;
        import javax.persistence.Column;
        import javax.persistence.Entity;
        import javax.persistence.GeneratedValue;
        import javax.persistence.GenerationType;
        import javax.persistence.Id;
        import javax.persistence.ManyToOne;
        import javax.persistence.Table;

        @Entity
        @Table(name="Books")
        public class Books implements Serializable{

        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="book_id")
        private int id;
        @Column(name="book_name")
        private String name;

        @Column(name="author_name")
        private String authorName;

        @ManyToOne
        Subject subject;

        public Subject getSubject() {
            return subject;
        }
        public void setSubject(Subject subject) {
            this.subject = subject;
        }

        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAuthorName() {
            return authorName;
        }
        public void setAuthorName(String authorName) {
            this.authorName = authorName;
        }

        }

Subject.java

    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue; 
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;

    @Entity
    @Table(name="Subject")
    public class Subject implements Serializable{

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="subject_id")
    private int id;
    @Column(name="subject_name")
    private String name;
    /**
    Observe carefully i have mentioned fetchType.EAGER. By default its is fetchType.LAZY for @OneToMany i have mentioned it but not required. Check the Output by changing it to fetchType.EAGER
    */

    @OneToMany(mappedBy="subject",cascade=CascadeType.ALL,fetch=FetchType.LAZY,
orphanRemoval=true)
    List<Books> listBooks=new ArrayList<Books>();

    public List<Books> getListBooks() {
        return listBooks;
    }
    public void setListBooks(List<Books> listBooks) {
        this.listBooks = listBooks;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    }

HibernateUtil.java

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {

 private static SessionFactory sessionFactory ;
 static {
    Configuration configuration = new Configuration();
    configuration.addAnnotatedClass (Com.OneToMany.Books.class);
    configuration.addAnnotatedClass (Com.OneToMany.Subject.class);
    configuration.setProperty("connection.driver_class","com.mysql.jdbc.Driver");
    configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/hibernate");                                
    configuration.setProperty("hibernate.connection.username", "root");     
    configuration.setProperty("hibernate.connection.password", "root");
    configuration.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
    configuration.setProperty("hibernate.hbm2ddl.auto", "update");
    configuration.setProperty("hibernate.show_sql", "true");
    configuration.setProperty(" hibernate.connection.pool_size", "10");
    configuration.setProperty(" hibernate.cache.use_second_level_cache", "true");
    configuration.setProperty(" hibernate.cache.use_query_cache", "true");
    configuration.setProperty(" cache.provider_class", "org.hibernate.cache.EhCacheProvider");
    configuration.setProperty("hibernate.cache.region.factory_class" ,"org.hibernate.cache.ehcache.EhCacheRegionFactory");

   // configuration
    StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
    sessionFactory = configuration.buildSessionFactory(builder.build());
 }
public static SessionFactory getSessionFactory() {
    return sessionFactory;
}
} 

Main.java

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;

    public class Main {

    public static void main(String[] args) {
        SessionFactory factory=HibernateUtil.getSessionFactory();
        save(factory);
        retrieve(factory);

    }

     private static void retrieve(SessionFactory factory) {
        Session session=factory.openSession();
        try{
            session.getTransaction().begin();
            Subject subject=(Subject)session.get(Subject.class, 1);
            System.out.println("subject associated collection is loading lazily as @OneToMany is lazy loaded");

            Books books=(Books)session.get(Books.class, 1);
            System.out.println("books associated collection is loading eagerly as by default @ManyToOne is Eagerly loaded");
            /*Books b1=(Books)session.get(Books.class, new Integer(1));

            Subject sub=session.get(Subject.class, 1);
            sub.getListBooks().remove(b1);
            session.save(sub);
            session.getTransaction().commit();*/
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            session.close();
        }

        }

       private static void save(SessionFactory factory){
        Subject subject=new Subject();
        subject.setName("C++");

        Books books=new Books();
        books.setAuthorName("Bala");
        books.setName("C++ Book");
        books.setSubject(subject);

        subject.getListBooks().add(books);
        Session session=factory.openSession();
        try{
        session.beginTransaction();

        session.save(subject);

        session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            session.close();
        }
    }

    }

মেইন.জাবার পুনরুদ্ধার () পদ্ধতিটি পরীক্ষা করে দেখুন। আমরা যখন বিষয় পেয়েই থাকে, তাহলে তার সংগ্রহে listBooks সঙ্গে সটীক @OneToMany, প্রখর রৌদ্রে লোড হবে। কিন্তু অন্যদিকে, বই এর সাথে সম্পর্কিত সংগ্রহ সমিতি বিষয় , সঙ্গে সটীক @ManyToOne, লোড eargerly (দ্বারা [default][1]জন্য @ManyToOne, fetchType=EAGER)। আমরা সাবজেক্ট.জভাতে @OneToManyফেচটাইপ.এগ্রার বা বুকস.জাভাতে ফেচটাইপ.লাজেওয়াই রেখে আচরণটি পরিবর্তন করতে @ManyToOneপারি।


1

পাবলিক এনাম ফেচটাইপ java.lang.Enum ডেটাবেস থেকে ডেটা আনার জন্য কৌশল নির্ধারণ করে। EAGER কৌশলটি দৃ pers়তা সরবরাহকারীর রানটাইমের একটি প্রয়োজনীয়তা যা ডেটা আগ্রহের সাথে আনতে হবে। অলস কৌশলটি অধ্যবসায় সরবরাহকারী রানটাইমের প্রতি ইঙ্গিত দেয় যে ডেটা যখন প্রথম অ্যাক্সেস করা হয় তখন আলস্যভাবে আনা উচিত। বাস্তবায়নের জন্য অধীর আগ্রহে ডেটা আনার অনুমতি দেওয়া হয়েছে যার জন্য অলস কৌশলটির ইঙ্গিতটি নির্দিষ্ট করা হয়েছে। উদাহরণ: @ বেসিক (ফেচ = এলজিওয়াই) সুরক্ষিত স্ট্রিং গেটনাম () {ফেরতের নাম; }

সূত্র


1

উপরে "কিউং হুয়ান মিন" যা বলেছে তাতে আমি এই নোটটি যুক্ত করতে চাই।

মনে করুন আপনি এই সাধারণ স্থপতিটির সাথে স্প্রিং রেস্ট ব্যবহার করছেন:

নিয়ামক <-> পরিষেবা <-> সংগ্রহস্থল

এবং আপনি সামনের প্রান্তে কিছু ডেটা ফিরিয়ে দিতে চান, আপনি যদি ব্যবহার করে থাকেন তবে আপনি FetchType.LAZYনিয়ামক পদ্ধতিতে ডেটা ফিরিয়ে দেওয়ার পরে একটি ব্যতিক্রম পাবেন যেহেতু সেবায় সেশনটি বন্ধ রয়েছে তাই JSON Mapper Objectডেটা পেতে না পারে।

এই সমস্যাটি সমাধান করার জন্য তিনটি সাধারণ বিকল্প রয়েছে, এটি নকশা, কর্মক্ষমতা এবং বিকাশকারী উপর নির্ভর করে:

  1. সবচেয়ে সহজটি ব্যবহার করা FetchType.EAGER, যাতে নিয়ন্ত্রক পদ্ধতিতে সেশনটি এখনও জীবিত থাকে।
  2. অ্যান্টি-প্যাটার্ন সমাধানগুলি, কার্যকর করা শেষ না হওয়া পর্যন্ত সেশনটিকে লাইভ করার জন্য এটি সিস্টেমে একটি বিশাল পারফরম্যান্স সমস্যা তৈরি করে।
  3. সর্বোত্তম অনুশীলন হ'ল FetchType.LAZYরূপান্তর পদ্ধতিতে ডেটা Entityঅন্য ডেটা অবজেক্টে স্থানান্তর করতে DTOএবং এটি নিয়ামকের কাছে প্রেরণে ব্যবহার করা, সুতরাং সেশনটি বন্ধ হয়ে গেলে কোনও ব্যতিক্রম নেই।


0

@ ড্রপ-শ্যাডো যদি আপনি হাইবারনেট ব্যবহার করেন তবে আপনি Hibernate.initialize()যখন getStudents()পদ্ধতিটি চালু করবেন তখন কল করতে পারবেন :

Public class UniversityDaoImpl extends GenericDaoHibernate<University, Integer> implements UniversityDao {
    //...
    @Override
    public University get(final Integer id) {
        Query query = getQuery("from University u where idUniversity=:id").setParameter("id", id).setMaxResults(1).setFetchSize(1);
        University university = (University) query.uniqueResult();
        ***Hibernate.initialize(university.getStudents());***
        return university;
    }
    //...
}

0

অলস: এটি সন্তানের সত্তা অলসভাবে আনে অর্থাত্ পিতামাতার সত্তা আনার সময় এটি কেবলমাত্র শিশু সত্তার প্রক্সি (সিগ্লিব বা অন্য কোনও ইউটিলিটি দ্বারা নির্মিত) আনে এবং যখন আপনি শিশু সত্তার কোনও সম্পত্তি অ্যাক্সেস করেন তবে এটি আসলে হাইবারনেট দ্বারা আনা হয়।

ইগর: এটি পিতামাতার সাথে সন্তানের সত্তাও নিয়ে আসে।

আরও ভাল বোঝার জন্য Jboss ডকুমেন্টেশনে যান বা আপনি hibernate.show_sql=trueআপনার অ্যাপ্লিকেশনটির জন্য ব্যবহার করতে পারেন এবং হাইবারনেট দ্বারা জারি করা অনুসন্ধানগুলি পরীক্ষা করতে পারেন ।

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