@ ওনটোমন্য তালিকা <> বনাম সেট <> পার্থক্য


96

আমি যদি ব্যবহার করি তবে কি কোনও পার্থক্য আছে?

@OneToMany
public Set<Rating> ratings;

বা যদি আমি ব্যবহার করি

@OneToMany
public List<Rating> ratings;

উভয়ই ঠিক আছে, আমি তালিকা এবং একটি সেটের মধ্যে পার্থক্য জানি, তবে এটি কীভাবে হাইবারনেট (বা বরং জেপিএ 2.0) পরিচালনা করে তা কোনও পার্থক্য করে কিনা তা আমি জানি না।

উত্তর:


112

একটি তালিকা, যদি কোনও সূচক কলাম নির্দিষ্ট না করা থাকে তবে কেবলমাত্র হাইবারনেট (কোনও নির্দিষ্ট ক্রম নেই) দ্বারা একটি ব্যাগ হিসাবে পরিচালনা করা হবে।

হাইবারনেট পরিচালনা করার ক্ষেত্রে একটি উল্লেখযোগ্য পার্থক্য হ'ল আপনি একক ক্যোয়ারিতে দুটি পৃথক তালিকা আনতে পারবেন না। উদাহরণস্বরূপ, যদি আপনার Personপরিচিতিগুলির একটি তালিকা এবং ঠিকানার তালিকা রয়েছে এমন কোনও সত্ত্বা থাকে, তবে আপনি তাদের সমস্ত পরিচিতি এবং সমস্ত ঠিকানা সম্বলিত লোড লোড করতে একটি একক কোয়েরি ব্যবহার করতে পারবেন না। এই ক্ষেত্রে সমাধানটি হল দুটি ক্যোয়ারী তৈরি করা (যা কার্তেসিয়ান পণ্য এড়ানো হয়), বা কমপক্ষে একটি সংগ্রহের জন্য এর Setপরিবর্তে একটি Listব্যবহার করা।

হাইবারনেটের সাথে সেটগুলি ব্যবহার করা প্রায়শই কঠিন যখন আপনাকে সংজ্ঞা দিতে হবে equalsএবং hashCodeসত্তাগুলিতে থাকতে হবে এবং সত্তায় কোনও স্থায়ী ফাংশনাল কী নেই।


4
এবং তালিকার সাথে কী ঘটে যায় তার বিশদর জন্য দেখুন স্ট্যাকওভারফ্লো . com/q/1995080/2495717
ben3000

31

আপনি যদি একটি তালিকা ব্যবহার করেন, তবে আপনি গিটার ফাংশনে একটি 'অর্ডার বিওয়াই' ধারাটি নির্দিষ্ট করতে পারেন। আপনি সেট দিয়ে তা করতে পারবেন না। ধারা অনুসারে অর্ডারে আংশিক EJBQL থাকতে পারে; উদাহরণ স্বরূপ

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

যদি আপনি এই ক্ষেত্রটি ফাঁকা ছেড়ে চলে যান, তবে তালিকাকে প্রাথমিক কীটির মানের ভিত্তিতে আরোহণের ক্রমে সাজানো হবে।


19
যেহেতু এটি আমাকে আমার হাইবারনেট ডক্সের জন্য ঝাঁকুনি দিয়েছিল: আপনি একটি সেট করতে পারেন @Sort - ডক্সে বর্ণিতSortedSet হিসাবে কেবল ব্যবহার করুন
মাবি

তবে আপনি যদি सॉোর্টসেট ব্যবহার করেন, এটি তুলনাকারীর সাথে সাজান, এটি ডাটাবেসের "অর্ডার বাই" দ্বারা অর্ডার করার কোনও উপায় নেই।
samir105

4
যেহেতু এটি পুরানো উত্তর, আমি এটি পরিষ্কার করতে চাই। বর্তমানে আমরা @OrderByএটি ব্যবহার করতে পারি Set। নীচে, হাইবারনেট ব্যবহার করবে OrderedSetTypeযা একটি ইনস্ট্যান্ট করবে LinkedHashSet, সুতরাং আদেশ সংরক্ষণ করা হবে। সংযোজন আমি LinkedHashSetসত্তা ব্যবহার করার পরামর্শ দেব - ধারাবাহিকতার জন্য। সূত্র: ডিসকোর্স.হবারনেট.আর. / ২ / ২
মার্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.