হাইবারনেটের ডিফল্ট আচরণটি আমরা সকলেই জানি যখন ব্যবহার করি @SequenceGenerator
- এটি একের মাধ্যমে প্রকৃত ডাটাবেস ক্রম বৃদ্ধি করে , এই মানটিকে 50 (ডিফল্ট allocationSize
মান) দ্বারা একাধিক করে - এবং তারপরে এই মানটি সত্তা আইডি হিসাবে ব্যবহার করে।
এটিকে অযথাযথ আচরণ এবং সাথে সঙ্ঘাত হয় স্পেসিফিকেশন যেখানে বলা আছে:
বরাদ্দ আকার - (ptionচ্ছিক) ক্রম থেকে ক্রম সংখ্যা বরাদ্দ করার সময় বাড়ানোর পরিমাণ।
পরিষ্কার হতে: আমি উত্পন্ন আইডিগুলির মধ্যে ফাঁকগুলি নিয়ে মাথা ঘামাই না।
আমি অন্তর্ভুক্ত ডেটাবেস ক্রম সাথে সামঞ্জস্যপূর্ণ নয় এমন আইডি সম্পর্কে যত্নশীল । উদাহরণস্বরূপ: অন্য কোনও অ্যাপ্লিকেশন (উদাহরণস্বরূপ প্লেইন জেডিবিসি ব্যবহার করে) সিকোয়েন্স থেকে প্রাপ্ত আইডির অধীনে নতুন সারি সন্নিবেশ করতে চাইতে পারে - তবে এই সমস্ত মানটি ইতিমধ্যে হাইবারনেট দ্বারা ব্যবহৃত হতে পারে! ম্যাডনেস।
কেউ কি এই সমস্যার কোনও সমাধান জানেন (সেটআপ না করে allocationSize=1
এবং এইভাবে কর্মক্ষমতা হ্রাস করে)?
সম্পাদনা:
বিষয়গুলি পরিষ্কার করার জন্য। যদি সর্বশেষ recordোকানো রেকর্ডে আইডি = থাকে 1
, তবে এইচবি 51, 52, 53...
একই সাথে তার নতুন সত্তাগুলির জন্য মানগুলি ব্যবহার করে: কিন্তু ডাটাবেসে ক্রমের মান সেট করা হবে 2
। অন্যান্য অ্যাপ্লিকেশনগুলি যখন এই ক্রমটি ব্যবহার করে যা সহজেই ত্রুটির দিকে পরিচালিত করতে পারে।
অন্যদিকে: স্পেসিফিকেশন বলছে (আমার বোঝার মধ্যে দিয়ে) যে ডাটাবেস ক্রমটি সেট করা উচিত ছিল 51
এবং এর মধ্যে এইচবি'র পরিসীমা থেকে মানগুলি ব্যবহার করা উচিত 2, 3 ... 50
আপডেট:
স্টিভ এবারসোল নীচে উল্লিখিত হিসাবে: আমার দ্বারা বর্ণিত আচরণ (এবং অনেকের কাছে সবচেয়ে স্বজ্ঞাত) সেট করে সক্রিয় করা যেতে পারে hibernate.id.new_generator_mappings=true
।
সবাইকে ধন্যবাদ.
আপডেট 2:
ভবিষ্যতের পাঠকদের জন্য নীচে আপনি একটি কাজের উদাহরণ খুঁজে পেতে পারেন।
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
private Long id;
}
persistence.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
save
ক্রমের পরবর্তী মানের জন্য ডাটাবেসকে জিজ্ঞাসা করা দরকার।
SequenceGenerator
হাইবারনেট শুধুমাত্র তথ্যভান্ডার অনুসন্ধান যখন ID- র পরিমাণ দ্বারা নির্দিষ্ট হবে allocationsize
রান আউট। যদি আপনি সেট আপ করেন allocationSize = 1
তবে প্রতিটি কারণ সন্নিবেশের জন্য হাইবারনেট ডিবিকে জিজ্ঞাসা করার কারণ এটি। এই মানটি পরিবর্তন করুন এবং আপনার কাজ শেষ হয়েছে।
hibernate.id.new_generator_mappings
সেটিং সত্যিই গুরুত্বপূর্ণ। আমি আশা করব এটি ডিফল্ট সেটিংস যে আইডি নম্বরটি কেন বন্য হয় তার জন্য আমাকে এত বেশি সময় ব্যয় করতে হবে না।