হাইবারনেট টীকাতে @ ইউনিক কনস্ট্রেন্ট এবং @ কলাম (অনন্য = সত্য)


106

@ ইউনিক কনস্ট্রেন্ট এবং @ কলাম (অনন্য = সত্য) এর মধ্যে পার্থক্য কী ?

উদাহরণ স্বরূপ:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)

এবং

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;

4
দ্রষ্টব্য: হাইবারনেট 5.4 এর সাথে, আমি যুক্ত করার সময় unique=true, সূচিটি স্বয়ংক্রিয়ভাবে আপডেটকারী স্কিম দ্বারা যুক্ত করা হয়নি। @UniqueConstraintএটি উপস্থিত করা। একটি বাগ হতে পারে।
ওন্দ্র Žižka

উত্তর:


149

যেমন আগেই বলা হয়েছিল, এটি যখন কেবলমাত্র একক ক্ষেত্র @Column(unique = true)হয় UniqueConstraintতখন একটি শর্টকাট হয় ।

আপনি যে উদাহরণ দিয়েছেন তা থেকে উভয়ের মধ্যে বিশাল পার্থক্য রয়েছে।

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;

এই কোডটি বোঝায় যে উভয়ই maskএবং groupঅনন্য হতে হবে তবে পৃথকভাবে। এর অর্থ হ'ল, উদাহরণস্বরূপ, যদি আপনার কাছে একটি মাস্ক.আইডি = 1 রয়েছে এবং রেকর্ডটি মাস্ক.আইডি = 1 দিয়ে সন্নিবেশ করানোর চেষ্টা করে , আপনি একটি ত্রুটি পাবেন কারণ সেই কলামটির অনন্য মান থাকতে হবে। গ্রুপের জন্য একই আবেদন।

অন্য দিকে,

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)

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

আপনি যদি মুখোশ এবং গোষ্ঠী উভয়ই আলাদা আলাদাভাবে এবং শ্রেণিবদ্ধ স্তরে আলাদা করে রাখতে চান তবে আপনাকে নিম্নলিখিত হিসাবে কোডটি লিখতে হবে:

@Table(
        name = "product_serial_group_mask",
        uniqueConstraints = {
                @UniqueConstraint(columnNames = "mask"),
                @UniqueConstraint(columnNames = "group")
        }
)

এটি প্রথম কোড ব্লকের মতোই প্রভাব ফেলে।


একবার অনন্য প্রতিবন্ধকতা তৈরি হয়ে গেলে আমি কি আমার জেপিএ রেপোজিটরিতে নামটি দিয়ে সীমাবদ্ধতার বিষয়ে জিজ্ঞাসা করতে পারি?
jDub9

@ jDub9 আপনি কোন সূচকে জিজ্ঞাসা করতে পারবেন না। আপনি একটি কোয়েরিতে মুখোশ এবং গোষ্ঠী কলামগুলি জিজ্ঞাসা করতে পারেন এবং এটি সেই সূচকটি দ্রুত প্রসেসিংয়ের জন্য ব্যবহার করবে (যদি আপনি ভাগ্যবান) তবে আপনি কেবল একটি সূচকে প্রশ্ন করতে পারবেন না।
ডালিবোর ফিলাস

সাবধান থাকুন যে কলামের নামগুলি অবশ্যই ডাটাবেসে প্রকৃত নাম হতে পারে। এটি হওয়া উচিত mask_idএবং group_idযদি আপনি ডিফল্ট নামকরণের কৌশল ব্যবহার করেন।
ভিট্রো 14:25

27

জাভা ই ই ডকুমেন্টেশন থেকে:

public abstract boolean unique

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

ডক দেখুন


সুতরাং আমি যখন এই কোডটি ব্যবহার করব: @ কলাম (অনন্য = সত্য) @ ম্যানি টোওন (alচ্ছিক = মিথ্যা, আনুন = ফ্যাচটাইপ.এইগ্রার) ব্যক্তিগত প্রোডাক্ট সিরিয়ালমাস্ক মাস্ক; @ কলাম (অনন্য = সত্য) @ManyToOne (alচ্ছিক = মিথ্যা, আনুন = ফেচটাইপ.এগ্রার) ব্যক্তিগত গোষ্ঠী গোষ্ঠী; আমার দুটি সূচক আছে তবে অন্য উপায়ে ব্যবহার করার সময় আমার একটি সূচক রয়েছে যে এটি দুটি কলামের সংমিশ্রণ?
নাভিড_ঘ

23

বোজের উত্তর ছাড়াও ...

@UniqueConstraintএলোমেলো নাম (যেমন ) উত্পন্ন করার সময় আপনাকে সীমাবদ্ধতার নাম দিতে দেয় ।@Column(unique = true)UK_3u5h7y36qqa13y3mauc5xxayq

কোন কোন সীমাবদ্ধতার সাথে কোন সীমাবদ্ধতা জড়িত তা জানার জন্য কখনও কখনও এটি সহায়ক হতে পারে। যেমন:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {
      @UniqueConstraint(
          columnNames = {"mask", "group"},
          name="uk_product_serial_group_mask"
      )
   }
)

5

@ বোয়াজ এবং @ vegemite4me এর উত্তরগুলি ছাড়াও ....

প্রয়োগ করে ImplicitNamingStrategyআপনি সীমাবদ্ধতার নামকরণের জন্য নিয়ম তৈরি করতে পারেন। নোট আপনি metadataBuilderহাইবারনেটের প্রারম্ভিকালে আপনার নামকরণের কৌশলটি জুড়েছেন:

metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());

এটি কাজ করে তবে এর জন্য @UniqueConstraintনয় @Column(unique = true), যা সর্বদা একটি এলোমেলো নাম জেনারেট করে (উদাঃ UK_3u5h7y36qqa13y3mauc5xxayq)।

এই সমস্যাটি সমাধান করার জন্য একটি বাগ রিপোর্ট রয়েছে, সুতরাং আপনি যদি পারেন তবে এটি প্রয়োগ করার জন্য দয়া করে সেখানে ভোট দিন। এখানে: https://hibernate.atlassian.net/browse/HHH-11586

ধন্যবাদ

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