একটি ওআরএম ম্যাপিংয়ের "মালিকানার দিক" কী?


128

কি ঠিক আছে স্বত্ব পাশ মানে? কিছু ম্যাপিং উদাহরণ ( একের অনেকের কাছে, এক থেকে এক, অনেকের কাছে একটি ) এর ব্যাখ্যা কী?

নীচের পাঠ্যটি জাভা EE 6 ডকুমেন্টেশনে @OneToOne এর বিবরণ থেকে একটি উদ্ধৃত অংশ । আপনি এতে ধারণার মালিকানা দেখতে পাচ্ছেন ।

এক-একের একাধিক গুণকে অন্য সত্তায় একক মূল্যবান সংযুক্তি সংজ্ঞা দেয়। সম্পর্কিত লক্ষ্য সত্তা স্পষ্টভাবে নির্দিষ্ট করা সাধারণত প্রয়োজন হয় না কারণ সাধারণত এটি নির্দিষ্ট করা অবজেক্টের ধরণ থেকে অনুমান করা যায়। যদি সম্পর্ক দ্বিপক্ষীয় হয় তবে মালিকানার পক্ষের সম্পর্কের ক্ষেত্র বা সম্পত্তি নির্দিষ্ট করতে ওয়ানটোন টীকাটির ম্যাপযুক্ত বাই উপাদানটি ব্যবহার করতে হবে।



5
আমি এটি পড়ার আগে পর্যন্ত হারিয়ে গিয়েছিলাম: javacodegeeks.com/2013/04/…
darga33

2
বিদেশী কী কলাম সহ ডিবি টেবিলটি নিজস্ব পক্ষ হিসাবে বিবেচিত হবে। সুতরাং যে ডিবি টেবিলটি উপস্থাপন করে এমন ব্যবসায়িক সংস্থা হ'ল সেই সম্পর্কের মালিক (মালিকানাধীন)। অগত্যা নয়, তবে বেশিরভাগ ক্ষেত্রে ওপেনিং-সাইডে @ জয়নক্লোনম টীকা থাকবে।
ডায়াবলো

উত্তর:


202

কেন নিজস্ব পক্ষের ধারণাটি প্রয়োজনীয়:

দ্বিপাক্ষিক সম্পর্কের নিজস্ব পক্ষের ধারণাটি আসে যে রিলেশনাল ডেটাবেজে বস্তুর ক্ষেত্রে দ্বিপাক্ষিক সম্পর্ক নেই। ডাটাবেসগুলিতে আমাদের কেবল একমুখী সম্পর্ক রয়েছে - বিদেশী কীগুলি।

নামটির 'মালিকানা' থাকার কারণ কী?

হাইবারনেট দ্বারা সন্ধান করা সম্পর্কের নিজস্ব দিকটি হ'ল সেই সম্পর্কের দিকটি যা ডাটাবেসে বিদেশী কীটির মালিকানায় থাকে

পাশের মালিকানার ধারণাটি কী সমাধান করে?

নিজস্ব পক্ষ ঘোষণা না করে ম্যাপযুক্ত দুটি সত্তার উদাহরণ নিন :

@Entity
@Table(name="PERSONS")
public class Person {
    @OneToMany
    private List<IdDocument>  idDocuments;
}

@Entity
@Table(name="ID_DOCUMENTS")
public class IdDocument {
    @ManyToOne
    private Person person;
}

ওও দৃষ্টিকোণ থেকে এই ম্যাপিংটি একটি দ্বি-দিকনির্দেশক সম্পর্ককে নয়, দুটি পৃথক এক-দিকনির্দেশক সম্পর্ককে সংজ্ঞায়িত করে ।

ম্যাপিংটি কেবল টেবিলগুলি তৈরি করে না PERSONSএবং ID_DOCUMENTSএটি একটি তৃতীয় সংযুক্তি টেবিল তৈরি করবে PERSONS_ID_DOCUMENTS:

CREATE TABLE PERSONS_ID_DOCUMENTS
(
  persons_id bigint NOT NULL,
  id_documents_id bigint NOT NULL,
  CONSTRAINT fk_persons FOREIGN KEY (persons_id) REFERENCES persons (id),
  CONSTRAINT fk_docs FOREIGN KEY (id_documents_id) REFERENCES id_documents (id),
  CONSTRAINT pk UNIQUE (id_documents_id)
)

লক্ষ্য করুন প্রাথমিক কী pkউপর ID_DOCUMENTSশুধুমাত্র। এই ক্ষেত্রে হাইবারনেট সম্পর্কের উভয় পক্ষকে স্বাধীনভাবে ট্র্যাক করে: আপনি যদি সম্পর্কের কোনও নথি Person.idDocumentsযুক্ত করেন তবে এটি অ্যাসোসিয়েশন সারণীতে একটি রেকর্ড সন্নিবেশ করে PERSON_ID_DOCUMENTS

অন্যদিকে idDocument.setPerson(person), আমরা যদি কল করি , আমরা টেবিলে বিদেশী কী ব্যক্তি_আইডিকে পরিবর্তন করি ID_DOCUMENTS। হাইবারনেট ডাটাবেসে দুটি দ্বি- দিকনির্দেশক (বিদেশী কী) সম্পর্ক তৈরি করছে, একটি দ্বি দ্বি নির্দেশমূলক অবজেক্টের সম্পর্ক বাস্তবায়নের জন্য ।

পাশের মালিকানার ধারণা কীভাবে সমস্যার সমাধান করে:

অনেক সময় আমরা কি চাই টেবিলের উপর শুধুমাত্র একটি বিদেশী চাবিকাঠি ID_DOCUMENTSপ্রতি PERSONSএবং অতিরিক্ত সমিতি টেবিল।

এটি সমাধানের জন্য আমাদেরকে হাইবারনেট কনফিগার করতে হবে সম্পর্কের পরিবর্তনগুলি ট্র্যাক করা বন্ধ করতে Person.idDocuments। হাইবারনেটের কেবল সম্পর্কের অন্য দিকটিই ট্র্যাক করা উচিত IdDocument.personএবং এটি করার জন্য আমরা ম্যাপডবাই যুক্ত করি :

@OneToMany(mappedBy="person")
private List<IdDocument>  idDocuments;

ম্যাপডবাই এর অর্থ কী?

এর অর্থ এইরকম কিছু: "সম্পর্কের এই দিকে পরিবর্তনগুলি ইতিমধ্যে ম্যাপ করা হয়েছে সম্পর্কের অন্য পক্ষের আইডডোকামেন্ট.প্রেসনেস, সুতরাং এটি অতিরিক্ত টেবিলে আলাদাভাবে এখানে ট্র্যাক করার প্রয়োজন নেই।"

কোনও গোটচা আছে, ফলাফল কি?

ম্যাপডবাই ব্যবহার করে , আমরা যদি কেবল কল করি person.getDocuments().add(document)তবে বিদেশী কীটি নতুন দস্তাবেজের সাথে সংযুক্ত ID_DOCUMENTSহবে না , কারণ এটি সম্পর্কের মালিকানা / ট্র্যাকিং দিক নয়!

নতুন ব্যক্তিকে ডকুমেন্ট লিঙ্ক করতে, আপনি স্পষ্টভাবে ফোন করতে হবে document.setPerson(person), কারণ যে মালিক পাশ সম্পর্ক।

ম্যাপডবাই ব্যবহার করার সময়, ডেভেলপারটিতে নতুন সম্পর্কের দৃistence়তা দৃ .় করার জন্য সম্পর্কের সঠিক দিকটি আপডেট করা এবং নিজের সম্পর্কের দিকটি কী তা জানার দায়িত্ব বিকাশকারী is


17
মতামতটি 'ম্যাপডবাই' + 'ইনভার্সডবাই'-এর ব্যাখ্যা দেয় এমন উত্তম উত্তরটি আমি খুঁজে পাই।
কার্ট ঝং

1
ম্যাপিংগুলি এবং ধারণার পিছনে কারণ উল্লেখ করার জন্য ধন্যবাদ।
মোহনিশ

1
জিনিসগুলি পরিবর্তিত হয়েছে কিনা তা আমি জানি না, তবে হাইবারনেট 5.0.9 এ। ফাইনাল যদি আমি "কেবল কল করি", তবে হাইবারনেট person.getDocuments().add(document)বিদেশী কী আপডেট করে ID_DOCUMENTS
নিকোলাস

1
@ কার্ল নিকোলাস, হাই, আপনার সাথে সম্মত হোন যে এনোটোটেশনের উপরে আমাদের ক্যাসকেড বৈশিষ্ট্য রয়েছে @OneToManyযা পার্সিস্টে সেট করা যেতে পারে এই ক্ষেত্রে হাইবারনেট সমস্ত সংযুক্ত সংস্থাগুলিকে ডিবি-তে সংরক্ষণ করবে। কেউ দয়া করে এটি পরিষ্কার করতে পারেন - কেন লেখক বলেছেন যে হাইবারনেট অ-মালিকানাধীন দিকগুলি পরিবর্তনগুলি ট্র্যাক করবে না - তবে বাস্তবে হাইবারনেটেড ট্র্যাকিং সম্পাদন করে?
ওলেকসান্ডার পাপচেনকো

3
ক্যাসকেড সরবরাহকারীকে বাচ্চাদের সত্তাগুলি সংরক্ষণ করতে বলছে এমনকি পিতা-মাতার সত্তা তাদের নিজস্ব না থাকলেও এটি কার্যকরভাবে নিয়মটিকে সংশোধন করে। যদি আপনার ম্যাপযুক্তবি = বাচ্চা.ফিল্ড থাকে (বা থাকে) এবং ক্যাসকেড না থাকে তবে তালিকার বাচ্চারা সংরক্ষণ করতে পারবেন না। এছাড়াও, যদি আপনার ম্যাপবিবি না থাকে এবং ক্যাসকেড না থাকে তবে পিতা বা মাতার সম্পর্কের মালিক এবং আপনি যদি নতুন বাচ্চাদের তালিকায় রাখেন এবং তারপরে পিতামাতাকে সংরক্ষণ করেন তবে এটি একটি ব্যতিক্রম ঘটবে কারণ নতুন বাচ্চাদের আইডি পাওয়া যায় নি যোগদানের টেবিলে সংরক্ষণ করুন। আশা করি যা বিষয়গুলিকে স্পষ্ট করে দিয়েছে ... :)
নিকোলাস

142

আপনি কল্পনা করতে পারেন যে নিজস্ব দিকটি সেই সত্তা যা অন্যটির সাথে রেফারেন্স রয়েছে। আপনার অংশে, আপনার এক-এক-এক সম্পর্ক রয়েছে। যেহেতু এটি একটি প্রতিসাম্পর্কীয় সম্পর্ক, আপনি এটি শেষ করবেন যদি বস্তু A বস্তুর B এর সাথে সম্পর্কিত হয় তবে তদ্বিপরীতও সত্য।

এর অর্থ হ'ল বস্তু A তে সংরক্ষণ করা অবজেক্ট বি এর একটি রেফারেন্স এবং অবজেক্ট বিতে অবজেক্ট এ এর ​​রেফারেন্স রিডান্ট্যান্ট হবে: এজন্য আপনি বেছে নিচ্ছেন কোনটি অবজেক্টের অন্যটির রেফারেন্স থাকা "মালিকানাধীন" আছে।

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

বহু-থেকে-বহু সম্পর্কের জন্য, যেহেতু আপনার আলাদা ম্যাপিং টেবিলের প্রয়োজন হবে তবে কোনও নিজস্ব পক্ষ থাকবে না।

উপসংহারে নিজস্ব পক্ষ হ'ল সেই সত্তা যা অন্যটির সাথে উল্লেখ থাকে।


6
আপনার ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ।
মাত্র একজন শিক্ষার্থী

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

5
ঠিক আছে, উত্তরটি আমার বেশিরভাগ ক্ষেত্রেই সঠিক। তবে হাইবারনেট অন্ততপক্ষে, এমনকি বহু-বহু সম্পর্কেরও একটি নিজস্ব দিক রয়েছে। এটি উদাহরণস্বরূপ আপডেট করার আচরণের জন্য জড়িত রয়েছে। এই টিউটোরিয়ালটির ৪ র্থ বিভাগে ("হাইবারনেট মডেল ক্লাস আপডেট করুন") একটি নিবিড় নজর দিন: ভাইরালপ্যাটেল.नेट
ব্লগস_

11
এই উত্তরটি তার সাহায্যের চেয়ে বেশি বিভ্রান্ত করে। দ্বিপক্ষীয় সম্পর্কের ক্ষেত্রে, উভয় সত্তা বস্তুর একে অপরের সাথে একটি রেফারেন্স থাকবে "আপনি ধারণা করতে পারেন যে" নিজস্ব দিকটি অন্যটির সাথে রেফারেন্সযুক্ত সত্তা "is এছাড়াও, "বহু-বহু সম্পর্কের জন্য, যেহেতু আপনার কোনও পৃথক ম্যাপিং টেবিলের প্রয়োজন হবে তবে কোনও নিজস্ব দিক থাকবে না" কেবল স্পষ্টতই ভুল: @ManyToManyসম্পর্কেরও নিজস্ব দিক রয়েছে। একইভাবে, @OneToManyসম্পর্কগুলি যোগ টেবিলগুলি ব্যবহার করতে পারে এবং আপনার এখনও একটি নিজস্ব দিক নির্দিষ্ট করতে হবে।
ডেভিডএস

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