ইউনিিডেডিশনাল এবং বিদায়ি জেপিএ এবং হাইবারনেট অ্যাসোসিয়েশনের মধ্যে পার্থক্য কী?


135

একমুখী এবং দ্বিদ্বিদী সংঘের মধ্যে পার্থক্য কী?

যেহেতু ডিবিতে তৈরি করা টেবিলটি সব একই, তাই আমি কেবলমাত্র তফাতটি পেয়েছি যে দ্বিদ্বিদ্বীপ সংঘের প্রতিটি পক্ষেরই অন্যটির সাথে রেফারেন্স থাকবে, এবং একমুখী নয়।

এটি একমুখী সমিতি is

public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}

public class Group {
    private int     id;
    private String  name;
}

দ্বি নির্দেশমূলক সমিতি

public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}
public class Group {
    private int         id;
    private String      name;
    @OneToMany(mappedBy="group")
    private List<User>  users;
}

পার্থক্যটি হ'ল গ্রুপটি ব্যবহারকারীর একটি উল্লেখ রেখেছে কিনা।

তাই আমি ভাবছি যদি এই একমাত্র পার্থক্য হয়? কোনটি সুপারিশ করা হয়?


7
গোষ্ঠীটি এখন জানতে পারবে এর মধ্যে কোন ব্যবহারকারী রয়েছে। আমি মনে করি না এটি কোনওভাবেই একটি ছোট পার্থক্য।
সাতাদ্রু বিশ্বাস

5
দ্বি-নির্দেশমূলক সম্পর্কগুলি আপডেট করার ক্ষেত্রে আমার জন্য বিশৃঙ্খলা হয়ে দাঁড়িয়েছিল। :)
diyoda_

উত্তর:


152

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

নোট করুন যে ন্যাভিগেশনাল অ্যাক্সেস সবসময় ভাল হয় না, বিশেষত "এক-থেকে-খুব-অনেক" এবং "বহু-থেকে-খুব-বহু" সম্পর্কের জন্য। Groupহাজার হাজার Userএস সমন্বিত এমন একটিটি কল্পনা করুন :

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

  • আপনি কিভাবে নতুন Userএস যুক্ত করবেন Group? সৌভাগ্যক্রমে, হাইবারনেট সম্পর্কের মালিকানাটির দিকে তাকাতে থাকে, তাই আপনি কেবল সেট করতে পারেন User.group। যাইহোক, আপনি যদি স্মৃতিতে অবজেক্টগুলিকে সামঞ্জস্য রাখতে চান তবে আপনাকে যুক্ত Userকরতে হবে Group.users। তবে এটি হাইবারনেটকে Group.usersডাটাবেস থেকে সমস্ত উপাদান আনতে সক্ষম করবে !

সুতরাং, আমি সেরা অভ্যাসগুলির সুপারিশের সাথে একমত হতে পারি না । আপনার ব্যবহারের ক্ষেত্রে বিবেচনা করে দ্বি-নির্দেশমূলক সম্পর্কগুলি সাবধানতার সাথে ডিজাইন করতে হবে (আপনার উভয় দিকের নেভিগেশনাল অ্যাক্সেসের দরকার আছে?) এবং সম্ভাব্য পারফরম্যান্সের প্রভাবগুলি।

আরো দেখুন:


হাই, ধন্যবাদ, মনে হচ্ছে আপনি হাইবারনেটের একজন পরীক্ষক, যেহেতু আপনি আমার প্রশ্নের উত্তর দিয়েছেন: স্ট্যাকওভারফ্লো / প্রশ্ন / 5৩৫০77০/২ । এবং এখন আমি সম্পর্কের বিষয়টি নিশ্চিত নই, যেহেতু আমি মন্তব্যটিতে বেশি লিখতে পারি না, তাই আমি এটি এখানে dpaste.de/J85m পোস্ট করি possible সম্ভব হলে দয়া করে একটি চেক করুন :) :)
hguser

@hguser: আপনি পরিশেষে আপনি সম্পর্ক দ্বিমুখী করতে সিদ্ধান্ত নেন, আমার মনে হয় এটা কলে ভাল হবে setGroup()থেকে addUser()অর্ডার উভয় পক্ষের সামঞ্জস্যপূর্ণ রাখা হবে।
axtavt

আমি কীভাবে গ্রুপ.এডডুসার () এর ভিতরে সেটগ্রুপ () কল না করি?
hguser

@ হিউগার: সম্পর্ক টিকিয়ে রাখা হবে না, উত্তরের পয়েন্ট ২ দেখুন। আপনি setGroup()ছাড়া কল করতে পারেন addUser(), তবে এটির ফলে মেমরিতে বস্তুর অসামঞ্জস্যিক অবস্থার সৃষ্টি হবে।
axtavt

আমি দেখতে পেয়েছি যে আমি একটি সঠিক ম্যাপিং করতে পারছি না, আপনি কি গিথুবে আমার প্রকল্পটি পরীক্ষা করার জন্য কিছুটা সময় ব্যয় করতে পারেন? এটি একটি সামান্য প্রকল্প।
hguser

31

দুটি প্রধান পার্থক্য আছে।

সমিতির পক্ষগুলি অ্যাক্সেস করা

প্রথমটি কীভাবে আপনি সম্পর্কের অ্যাক্সেস করবেন তা সম্পর্কিত। একমুখী অ্যাসোসিয়েশনের জন্য, আপনি কেবল এক প্রান্ত থেকে সমিতিটি নেভিগেট করতে পারেন।

সুতরাং, একটি একমুখী @ManyToOneঅ্যাসোসিয়েশনের জন্য, এর অর্থ হ'ল বিদেশী চাবি যেখানে থাকে কেবলমাত্র সেই পক্ষ থেকে আপনি সেই সম্পর্কটি অ্যাক্সেস করতে পারবেন।

যদি আপনার একমুখী @OneToManyসমিতি থাকে তবে এর অর্থ হ'ল বিদেশী চাবি যেখানে থাকে কেবল আপনি সেই পিতৃ পক্ষ থেকেই সম্পর্কটি অ্যাক্সেস করতে পারবেন।

দ্বিপাক্ষিক @OneToManyসংঘের জন্য, আপনি উভয় উপায়েই সমিতিটি নেভিগেট করতে পারেন, হয় পিতা-মাতার কাছ থেকে বা সন্তানের পক্ষ থেকে।

এছাড়াও আপনি প্রয়োজন দ্বিমুখী সমিতির নিশ্চিত করুন যে উভয় পক্ষের সঠিকভাবে সিঙ্ক্রোনাইজ হয় করতে জন্য অ্যাড / Remove ইউটিলিটি পদ্ধতি ব্যবহার

কর্মক্ষমতা

দ্বিতীয় দিকটি পারফরম্যান্সের সাথে সম্পর্কিত।

  1. কারণ @OneToMany, একমুখী সমিতিগুলি পাশাপাশি দ্বি-দিকনির্দেশনাগুলিও সম্পাদন করে না
  2. কারণ @OneToOne, একটি দ্বিপাক্ষিক অ্যাসোসিয়েশন অভিভাবকদের আগ্রহের সাথে উত্সাহিত করবে যদি হাইবারনেট প্রক্সি বরাদ্দ করা উচিত বা একটি নাল মান বলতে পারে না
  3. জন্য @ManyToMany, সংগ্রহে টাইপ বেশ একটা পার্থক্য যেমন তোলে Setsবেশী ভালো সঞ্চালনLists

11

কোডিংয়ের ক্ষেত্রে, একটি দ্বিপাক্ষিক সম্পর্ক বাস্তবায়নের জন্য আরও জটিল কারণ অ্যাপ্লিকেশনটি উভয় পক্ষকে জেপিএ স্পেসিফিকেশন 5 (পৃষ্ঠা 42 এ) অনুযায়ী সমন্বয় করার জন্য দায়ী। দুর্ভাগ্যক্রমে স্পেসিফিকেশনে প্রদত্ত উদাহরণ আরও বিশদ দেয় না, সুতরাং এটি জটিলতার মাত্রা সম্পর্কে ধারণা দেয় না।

দ্বিতীয় স্তরের ক্যাশে ব্যবহার না করার সময় সম্পর্কের পদ্ধতিগুলি সঠিকভাবে প্রয়োগ না করা সাধারণত সমস্যা হয় না কারণ লেনদেনের শেষে উদাহরণগুলি বাতিল হয়ে যায়।

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

একটি সঠিকভাবে বাস্তবায়িত দ্বি-দিকনির্দেশক সম্পর্ক অনুসন্ধানগুলি এবং কোডটিকে আরও সহজ করে তুলতে পারে, তবে এটি যদি ব্যবসায়ের যুক্তির বিচারে সত্যিকার অর্থে না আসে তবে এটি ব্যবহার করা উচিত নয়।


9

আমি 100% নিশ্চিত নই যে এটিই কেবলমাত্র পার্থক্য, তবে এটিই মূল পার্থক্য। হাইবারনেট ডক্স দ্বারা দ্বি-দিকনির্দেশক সমিতি থাকার সুপারিশ করা হয়:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.html

বিশেষ করে:

দ্বি-নির্দেশমূলক সমিতিগুলি পছন্দ করুন: একমুখী সমিতিগুলি জিজ্ঞাসা করা আরও কঠিন। একটি বড় অ্যাপ্লিকেশনটিতে, প্রায় সমস্ত সমিতি অবশ্যই প্রশ্নের উভয় দিকেই নাব্য হতে পারে।

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


দ্বি-দিকনির্দেশনা কিছু ক্ষেত্রে আঘাত করতে পারে, যেমন অ্যাক্সটাভেট ব্যাখ্যা করেছে! হাইবারনেট সত্তায় ম্যাপযুক্ত প্রতিটি সম্পর্কের সাথে আমি খুব যত্নবান হব! হাইবারনেটে জিনিস লোড করার জন্য প্রয়োজনীয় অবিরাম সময়ের সাথে আপনি শেষ করতে পারেন, যদি না আপনি ঠিক কী করছেন তা না জেনে। ব্যবহারের ক্ষেত্রে যত্ন সহকারে চিন্তা করুন এবং বিভিন্ন ব্যবহারের ক্ষেত্রে বিভিন্ন মডেলের ক্লাস ব্যবহার করুন। F.ex. জিনিসের তালিকায় আমার সমস্ত সম্পর্কিত অবজেক্টের দরকার নেই, কেবল একটি লেবেল এবং আইডি। সুতরাং তালিকা সত্তা আমার জন্য বিশদ সত্তার চেয়ে আলাদা (এবং খুব সাধারণ)।
cslotty
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.