JPA @OneToMany অ্যাসোসিয়েশন ব্যবহার করার সময় @ জোইনকলাম এবং ম্যাপযুক্তের মধ্যে পার্থক্য কী


516

পার্থক্য কি:

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    @JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")
    private List<Branch> branches;
    ...
}

এবং

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, mappedBy = "companyIdRef")
    private List<Branch> branches;
    ...
}

1
আরো দেখুন কি একটি ORM ম্যাপিং মালিক দিক আছে জড়িত বিষয় সত্যিই একটি ভাল ব্যাখ্যা জন্য প্রশ্ন।
dirkt

উত্তর:


545

টীকাটি @JoinColumnনির্দেশ করে যে এই সত্তাটি সম্পর্কের মালিক (এটি: সম্পর্কিত টেবিলটি রেফারেন্সযুক্ত টেবিলের একটি বিদেশী কী সহ একটি কলাম রয়েছে), তবে বৈশিষ্ট্যটি mappedByনির্দেশ করে যে এই পক্ষের সত্তাটি সম্পর্কের বিপরীত, এবং মালিক "অন্যান্য" সত্তায় থাকেন। এর অর্থ হ'ল আপনি যে ক্লাসটি "ম্যাপডবাই" (সম্পূর্ণ দ্বি নির্দেশমূলক সম্পর্ক) দিয়ে মন্তব্য করেছেন সে শ্রেণী থেকে আপনি অন্য টেবিলটি অ্যাক্সেস করতে পারবেন।

বিশেষত, প্রশ্নের কোডের জন্য সঠিক টীকাগুলি এর মতো দেখাবে:

@Entity
public class Company {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company")
    private List<Branch> branches;
}

@Entity
public class Branch {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId")
    private Company company;
}

3
উভয় ক্ষেত্রে শাখার কোম্পানির আইডি সহ ক্ষেত্র রয়েছে।
মাইখ্যালো আদোমোভিচ

3
কোম্পানির টেবিলে রেফারেন্সযুক্ত টেবিলের জন্য একটি বিদেশী কী সহ একটি কলাম নেই - শাখাটি কোম্পানিকে রেফ করে দিয়েছে .. আপনি কেন "সংশ্লিষ্ট টেবিলের রেফারেন্স টেবিলের একটি বিদেশী কী সহ একটি কলাম আছে" বলছেন? আপনি আরও কিছু দয়া করে ব্যাখ্যা করতে পারেন।
মাইখ্যালো আদোমোভিচ

13
@ মাইখায়লোআডামোভিচ আমি নমুনা কোড সহ আমার উত্তর আপডেট করেছি। লক্ষ্য করুন যে এটি ব্যবহার করতে ভুল @JoinColumnহয়েছেCompany
এস্কার লোপেজ

10
@ মাইখায়লো আডামোভিচ: না, আসলে এটি মোটেই ঠিক নয়। যদি Branchউল্লেখ না করে এমন সম্পত্তি না থাকে Companyতবে অন্তর্নিহিত টেবিলটিতে একটি কলাম রয়েছে যা এটি করে, তবে আপনি @JoinTableএটি মানচিত্র করতে ব্যবহার করতে পারেন । এটি একটি অস্বাভাবিক পরিস্থিতি, কারণ আপনি সাধারণত কোনও বস্তুর কলামটি তার টেবিলের সাথে ম্যাপ করে যাবেন তবে এটি ঘটতে পারে এবং এটি পুরোপুরি বৈধ।
টম অ্যান্ডারসন

4
এটি ওআরএম পছন্দ না করার আরেকটি কারণ। ডকুমেন্টেশন প্রায়শই খুব কৃপণ হয় এবং আমার বইগুলিতে এটি খুব বেশি যাদু অঞ্চলে উন্নত হয়। আমি এই সমস্যাটির সাথে লড়াই করে যাচ্ছি এবং যখন একটির জন্য শব্দ দ্বারা শব্দ অনুসরণ করা হয় @OneToOne, তখন শিশুরা সারিগুলি nullতাদের FKey কলামে একটি সাথে আপডেট হয় যা পিতামাতার উল্লেখ করে।
আশেশ

225

@JoinColumnসম্পর্কের উভয় পক্ষেই ব্যবহার করা যেতে পারে। প্রশ্ন ব্যবহার সম্পর্কে ছিল @JoinColumnউপর @OneToManyসাইড (বিরল ক্ষেত্রে)। এবং এখানে বিন্দুটি শারীরিক তথ্য সদৃশ (কলামের নাম) এর সাথে অপ্টিমাইজড এসকিউএল কোয়েরি নয় যা কিছু অতিরিক্ত UPDATEবিবৃতি উত্পন্ন করবে

ডকুমেন্টেশন অনুযায়ী :

যেহেতু অনেকের মধ্যেই জেপিএ অনুচ্ছেদে দ্বি-নির্দেশমূলক সম্পর্কের মালিক প্রায় (প্রায়) সর্বদা থাকে , তাই বহু সংস্থার সাথে এক এটির দ্বারা মন্তব্য করা হয়@OneToMany(mappedBy=...)

@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    ...
} 

TroopSoldierসৈন্যদলের সম্পত্তির মাধ্যমে বহু সম্পর্কের ক্ষেত্রে একটি দ্বিপাক্ষিক রয়েছে । আপনাকে mappedByপাশের কোনও শারীরিক ম্যাপিং সংজ্ঞায়িত করতে হবে (অবশ্যই হবে না) ।

একাধিক দিকের একের সাথে অনেকের কাছে নিজস্ব দিক হিসাবে মানচিত্র তৈরি করতে , আপনাকে mappedByউপাদানটি সরাতে হবে এবং অনেককে এক @JoinColumnহিসাবে insertableএবং updatableমিথ্যাতে সেট করতে হবে । এই সমাধানটি অনুকূলিত নয় এবং কিছু অতিরিক্ত UPDATEবিবৃতি দেবে।

@Entity
public class Troop {
    @OneToMany
    @JoinColumn(name="troop_fk") //we need to duplicate the physical information
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk", insertable=false, updatable=false)
    public Troop getTroop() {
    ...
}

1
ট্রুপ কীভাবে আপনার দ্বিতীয় স্নিপেটে মালিক হতে পারে তা আমি বুঝতে সক্ষম নই, সৈনিক এখনও মালিক, কারণ এতে ট্রুপের কাছে বিদেশী কী উল্লেখ রয়েছে। (আমি মাইএসকিএল ব্যবহার করছি, আমি আপনার পদ্ধতির সাথে পরীক্ষা করেছি)।
অখিলেশ

10
আপনার উদাহরণে টীকাটি mappedBy="troop"কোন ক্ষেত্রকে উল্লেখ করে?
ফ্র্যাক্টালাইস্ট

5
@ ফ্র্যাকালাইস্ট টীকাটি mappedBy="troop"শ্রেণীর সৈনিকের সম্পত্তি ট্রুপকে বোঝায়। উপরের কোডটিতে সম্পত্তিটি দৃশ্যমান নয় কারণ এখানে মাইখেলো এটি বাদ দিয়েছে তবে আপনি গেট ট্রুপ () এর সাহায্যে এর অস্তিত্বটি হ্রাস করতে পারেন। অস্কার লোপেজের উত্তরটি দেখুন , এটি খুব স্পষ্ট এবং আপনি পয়েন্টটি পাবেন।
নিকোলিমো 86

1
এই উদাহরণটি জেপিএ 2 নির্দিষ্টকরণের অপব্যবহার। লেখকের উদ্দেশ্য যদি দ্বি নির্দেশমূলক সম্পর্ক তৈরি করা হয় তবে এটি পিতামাতার পক্ষ থেকে ম্যাপডবাই এবং সন্তানের পাশে জয়েন্টকলাম (প্রয়োজনে) ব্যবহার করা উচিত। এখানে উপস্থাপিত পদ্ধতির সাথে আমরা দুটি দ্বি-নির্দেশমূলক সম্পর্ক পাচ্ছি: ওয়ানটোমনি এবং ম্যান্টি টোনে যারা স্বতন্ত্র কিন্তু কেবল ভাগ্য দ্বারা (আরও অপব্যবহার করে) সেই 2 টি সম্পর্ক একই বিদেশী কী ব্যবহার করে সংজ্ঞায়িত হয়েছে
অরেলিজে

1
আপনি যদি জেপিএ ২.x ব্যবহার করছেন তবে নীচে আমার উত্তরটি একটু পরিষ্কার er যদিও আমি উভয় রুটের চেষ্টা করার এবং হাইবারনেট যখন সারণীগুলি তৈরি করে তখন কী করে তা দেখার পরামর্শ দিই। আপনি যদি নতুন প্রকল্পে থাকেন তবে আপনার প্রয়োজন অনুযায়ী যে কোনও প্রজন্মকে আপনার চয়ন করুন pick আপনি যদি কোনও লিগ্যাসি ডাটাবেসে থাকেন এবং কাঠামোটি পরিবর্তন করতে না চান, আপনার স্কিমার সাথে যে কোনওটির সাথে মেলে।
স্নেকসে

65

যেহেতু এটি একটি খুব সাধারণ প্রশ্ন, আমি এই নিবন্ধটি লিখেছি , যার ভিত্তিতে এই উত্তরটি ভিত্তিক।

একমুখী এক থেকে বহু সমিতি

যেমনটি আমি এই নিবন্ধে ব্যাখ্যা করেছি , আপনি যদি @OneToManyটীকাটি ব্যবহার করে থাকেন তবে নীচের চিত্রের মধ্যে @JoinColumnপিতা বা মাতার Postসত্তা এবং সন্তানের মধ্যকার একটি দিকনির্দেশক সমিতি রয়েছে PostComment:

একমুখী এক থেকে বহু সমিতি

একমুখী এক থেকে বহু সংযোগ ব্যবহার করার সময়, কেবল পিতামাতার পক্ষই ম্যাসেজ করে।

এই উদাহরণে, কেবল Postসত্তা @OneToManyশিশু PostCommentসত্তার সাথে একটি সংজ্ঞা সংজ্ঞা দেবে :

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();

দ্বি-নির্দেশিক এক থেকে বহু সংঘবদ্ধ

আপনি যদি এট্রিবিউট সেটটি ব্যবহার করেন @OneToManyতবে mappedByআপনার একটি দ্বিদলীয় সমিতি রয়েছে। আমাদের ক্ষেত্রে, উভয় সত্তারই শিশু সত্তার Postসংকলন রয়েছে PostCommentএবং নীচের চিত্রের দ্বারা চিত্রিত হিসাবে শিশু PostCommentসত্তার পিতামত্তা সত্তার দিকে ফিরে একটি উল্লেখ রয়েছে Post:

দ্বি-নির্দেশিক এক থেকে বহু সংঘবদ্ধ

ইন PostCommentসত্তা, postনিম্নরূপ সত্তা সম্পত্তি ম্যাপ করা হয়:

@ManyToOne(fetch = FetchType.LAZY)
private Post post;

কারণ আমরা স্পষ্টভাবে নির্ধারণ fetchকরার অ্যাট্রিবিউট FetchType.LAZY, কারণ ডিফল্টরূপে, সমস্ত @ManyToOneএবং @OneToOneসমিতির সংগৃহীত সাগ্রহে যা n + 1 ক্যোয়ারী সমস্যা সৃষ্ঠি করতে পারে করে। এই বিষয় সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন

ইন Postসত্তা, commentsনিম্নরূপ সমিতি ম্যাপ করা হয়:

@OneToMany(
    mappedBy = "post",
    cascade = CascadeType.ALL,
    orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();

mappedByএর অ্যাট্রিবিউট @OneToManyটীকা রেফারেন্স postসন্তানের সম্পত্তি PostCommentসত্তা, এবং, এই ভাবে, হাইবারনেট জানে যে দ্বিমুখী সমিতি দ্বারা নিয়ন্ত্রিত হয় @ManyToOneপাশ, যা বিদেশী কী কলাম মান এই টেবিল সম্পর্ক উপর ভিত্তি করে তৈরি পরিচালনার দায়িত্বে আছেন।

একটি দ্বিমুখী সমিতি জন্য, আপনি দুই ইউটিলিটি পদ্ধতি, মত থাকতে হবে addChildএবং removeChild:

public void addComment(PostComment comment) {
    comments.add(comment);
    comment.setPost(this);
}

public void removeComment(PostComment comment) {
    comments.remove(comment);
    comment.setPost(null);
}

এই দুটি পদ্ধতি দ্বিদলীয় অ্যাসোসিয়েশনের উভয় পক্ষই সিঙ্ক নয় তা নিশ্চিত করে। উভয় প্রান্তের সিঙ্ক্রোনাইজ করা ছাড়া হাইবারনেট গ্যারান্টি দেয় না যে অ্যাসোসিয়েশন রাষ্ট্রের পরিবর্তনগুলি ডাটাবেসে প্রচার করবে।

জেপিএ এবং হাইবারনেটের সাথে দ্বি-নির্দেশমূলক সমিতিগুলিকে সিঙ্ক্রোনাইজ করার জন্য সেরা ওয়াট সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন

কোনটি বেছে নেবে?

একমুখী @OneToManyসমিতি খুব ভাল সঞ্চালন নেই , তাই আপনি এটি এড়িয়ে চলা উচিত।

আপনি দ্বিমুখী @OneToManyযা আরও কার্যকরী তা ব্যবহার করা ভাল ।


32

টীকাগুলি ম্যাপডবি দ্বারা আদর্শভাবে সর্বদা দ্বি-দিকীয় সম্পর্কের প্যারেন্ট সাইড (কোম্পানির শ্রেণি) ব্যবহার করা উচিত, এক্ষেত্রে এটি শিশু শ্রেণির (শাখা শ্রেণি) সদস্য ভেরিয়েবল 'সংস্থাকে' নির্দেশ করে সংস্থার শ্রেণিতে হওয়া উচিত should

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

নীচে কাজের উদাহরণ:

অভিভাবক শ্রেণি, সংস্থা

@Entity
public class Company {


    private int companyId;
    private String companyName;
    private List<Branch> branches;

    @Id
    @GeneratedValue
    @Column(name="COMPANY_ID")
    public int getCompanyId() {
        return companyId;
    }

    public void setCompanyId(int companyId) {
        this.companyId = companyId;
    }

    @Column(name="COMPANY_NAME")
    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="company")
    public List<Branch> getBranches() {
        return branches;
    }

    public void setBranches(List<Branch> branches) {
        this.branches = branches;
    }


}

শিশু শ্রেণি, শাখা

@Entity
public class Branch {

    private int branchId;
    private String branchName;
    private Company company;

    @Id
    @GeneratedValue
    @Column(name="BRANCH_ID")
    public int getBranchId() {
        return branchId;
    }

    public void setBranchId(int branchId) {
        this.branchId = branchId;
    }

    @Column(name="BRANCH_NAME")
    public String getBranchName() {
        return branchName;
    }

    public void setBranchName(String branchName) {
        this.branchName = branchName;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="COMPANY_ID")
    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }


}

20

আমি যোগ করতে ঠিক যে চাই @JoinColumnসবসময় এর সাথে সম্পর্কিত করা হবে তা নয় শারীরিক তথ্য অবস্থান যেমন এই উত্তর দাড়ায়। আপনি একত্রিত করতে পারেন @JoinColumnসঙ্গে @OneToManyএমনকি যদি পিতা বা মাতা টেবিল শিশু টেবিলে ইশারা কোন টেবিল ডেটা নেই।

জেপিএ-তে কীভাবে একবিদেশীয় ওয়ানটোমেন সম্পর্কের সংজ্ঞা দেওয়া যায়

একমুখী ওয়ানটোম্যানি, কোনও বিপরীতমুখী মাল্টিওন, কোনও যোগদানের টেবিল নেই

এটি কেবল JPA 2.x+যদিও পাওয়া যাবে বলে মনে হচ্ছে । এটি এমন পরিস্থিতিতে দরকারী যেখানে আপনি চান শিশু শ্রেণিটি কেবলমাত্র পিতামাতার আইডি রাখতে পারে, পুরো রেফারেন্সের মতো নয়।


আপনি ঠিক বলেছেন, জয়েন টেবিল ছাড়াই একমুখী ওয়ানটাইমেনির জন্য সমর্থন জেপিএ 2
তে

17

আমি এখানে অস্কার লোপেজের গৃহীত উত্তরের সাথে একমত নই। উত্তরটি ভুল!

এটি এমন নয় @JoinColumnযা নির্দেশ করে যে এই সত্তাটি সম্পর্কের মালিক। পরিবর্তে, এটি @ManyToOneটীকা যা এটি করে (তার উদাহরণে)।

সম্পর্কের টীকাগুলি যেমন @ManyToOne, @OneToManyএবং @ManyToManyজেপিএ / হাইবারনেটকে ম্যাপিং তৈরি করতে বলুন ডিফল্টরূপে, এটি একটি পৃথক যোগদানের টেবিলের মাধ্যমে সম্পন্ন করা হয়।


@JoinColumn

এর উদ্দেশ্য @JoinColumnহ'ল যদি ইতিমধ্যে কোনও উপস্থিত না থাকে তবে একটি জয়েন কলাম তৈরি করা । যদি এটি হয়, তবে এই টীকাটি যোগদানের কলামটির নাম রাখতে ব্যবহৃত হতে পারে ।


MappedBy

MappedByপ্যারামিটারটির উদ্দেশ্য জেপিএকে নির্দেশ দেওয়া: আর একটি যোগ টেবিল তৈরি করবেন না কারণ ইতিমধ্যে এই সম্পর্কের বিপরীত সত্তা দ্বারা সম্পর্কটি ম্যাপ করা হচ্ছে ।



মনে রাখবেন: MappedByসম্পর্কের টীকাগুলির একটি সম্পত্তি যার উদ্দেশ্য হ'ল দুটি সত্ত্বাকে সম্পর্কিত একটি ব্যবস্থা তৈরি করা যা পূর্বনির্ধারিতভাবে তারা একটি টেবিল তৈরি করে ডিফল্টরূপে করে। MappedByপ্রক্রিয়াটি এক দিকে থামিয়ে দেয়।

যে সত্তাটি ব্যবহার MappedByকরছে না তাকে সম্পর্কের মালিক বলা হয় কারণ বিদেশী কী ক্ষেত্রের বিরুদ্ধে তিনটি ম্যাপিং টীকাগুলির মধ্যে একটির মাধ্যমে ম্যাপিংয়ের মেকানিকগুলি তার শ্রেণীর মধ্যে নির্ধারিত হয়। এটি কেবল ম্যাপিংয়ের প্রকৃতি নির্দিষ্ট করে না তবে একটি যোগদান টেবিল তৈরির নির্দেশ দেয়। তদ্ব্যতীত, যোগদানের টেবিলটি দমন করার বিকল্পটি বিদেশী কী-র উপরে @ জোইনক্লম টীকাটি প্রয়োগ করে উপস্থিত রয়েছে যা এটিকে পরিবর্তে মালিক সত্তার টেবিলের মধ্যে রাখে।

সুতরাং সংক্ষেপে: @JoinColumnহয় একটি নতুন যোগদানের কলাম তৈরি করে বা একটি বিদ্যমান নাম পরিবর্তন করে; থাকাকালীন MappedByপ্যারামিটার অর্ডার মাধ্যমে পারেন একটি ম্যাপিং তৈরি করার জন্য অন্যান্য (শিশু) ক্লাসের সম্পর্ক টীকা সঙ্গে সমন্বিত সহযোগিতায় কাজ করে টেবিল বা মালিক সত্তার সংশ্লিষ্ট সারণিতে একটি বিদেশী কী কলাম তৈরি করে যোগদান করুন।

কীভাবে MapppedByকাজ করে তা চিত্রিত করতে নীচের কোডটি বিবেচনা করুন। যদি MappedByপ্যারামিটারটি মুছতে হয়, তবে হাইবারনেট আসলে TWO- এ যোগদানের টেবিল তৈরি করবে! কেন? কারণ বহু-বহু সম্পর্কের মধ্যে একটি প্রতিসাম্য রয়েছে এবং হাইবারনেটের অপরদিকে একটি দিক বাছাই করার কোনও যুক্তি নেই।

তাই আমরা MappedByহাইবারনেটকে বলার জন্য ব্যবহার করি , দুটি সত্তার মধ্যে সম্পর্কের ম্যাপিংয়ের জন্য আমরা অন্য সত্ত্বাকে বেছে নিয়েছি ।

@Entity
public class Driver {
    @ManyToMany(mappedBy = "drivers")
    private List<Cars> cars;
}

@Entity
public class Cars {
    @ManyToMany
    private List<Drivers> drivers;
}

মালিক শ্রেণিতে @ জোইন কলাম (নাম = "ড্রাইভারআইডি") যুক্ত করা, একটি যোগদান টেবিল তৈরি করা রোধ করবে এবং পরিবর্তে, একটি ম্যাপিং তৈরির জন্য গাড়ি টেবিলের মধ্যে একটি ড্রাইভার আইডি বিদেশি কী কলাম তৈরি করবে:

@Entity
public class Driver {
    @ManyToMany(mappedBy = "drivers")
    private List<Cars> cars;
}

@Entity
public class Cars {
    @ManyToMany
    @JoinColumn(name = "driverID")
    private List<Drivers> drivers;
}

1

জেপিএ একটি স্তরযুক্ত এপিআই, বিভিন্ন স্তরের নিজস্ব টীকা রয়েছে। সর্বাধিক স্তরটি হ'ল (1) সত্তা স্তর যা ধ্রুবক শ্রেণীর বর্ণনা দেয় তারপরে আপনার কাছে (2) রিলেশনাল ডাটাবেস স্তর থাকে যা ধরে নেয় যে সত্তাগুলি একটি সম্পর্কিত ডেটাবেস এবং (3) জাভা মডেলটিতে ম্যাপ করা হয়েছে।

লেভেল 1 টীকা: @Entity, @Id, @OneToOne, @OneToMany,@ManyToOne , @ManyToMany। আপনি কেবলমাত্র এই উচ্চ স্তরের টীকাগুলি ব্যবহার করে আপনার অ্যাপ্লিকেশনটিতে অধ্যবসায়ের পরিচয় দিতে পারেন। তবে তারপরে আপনাকে জেপিএ অনুমান অনুসারে আপনার ডাটাবেস তৈরি করতে হবে। এই টীকাগুলি সত্তা / সম্পর্কের মডেল নির্দিষ্ট করে।

শ্রেনী 2 টীকা: @Table, @Column,@JoinColumn , ... সত্ত্বা / বৈশিষ্ট্য থেকে ম্যাপিং রিলেশনাল ডাটাবেস সারণি প্রভাব / কলাম যদি আপনি JPA এর ডিফল্ট সন্তুষ্ট না অথবা আপনি একটি বিদ্যমান ডাটাবেস ম্যাপ প্রয়োজন হলে। এই টীকাগুলি বাস্তবায়ন টীকা হিসাবে দেখা যেতে পারে, তারা ম্যাপিং কীভাবে করা উচিত তা নির্দিষ্ট করে।

আমার মতে উচ্চ স্তরের টীকাগুলিতে যতটা সম্ভব স্থায়ী হওয়া এবং তারপরে প্রয়োজনীয় স্তর হিসাবে নিম্ন স্তরের এনোটেশনগুলি প্রবর্তন করা ভাল।

প্রশ্নের উত্তর দেওয়ার জন্য: @OneToMany/ mappedByখুব ভাল কারণ এটি কেবল সত্তা ডোমেন থেকে টীকাগুলি ব্যবহার করে। @oneToMany/ @JoinColumnএছাড়াও জরিমানা কিন্তু এটি একটি বাস্তবায়ন টীকা যেখানে এই কঠোরভাবে প্রয়োজন নেই ব্যবহার করে।


1

আমাকে সহজ করে তুলি
আপনি @ জয়লন কলাম ব্যবহার করতে পারেন ম্যাপিং নির্বিশেষে উভয় পক্ষেই ।

এর তিনটি ক্ষেত্রে বিভক্ত করা যাক।
1) শাখা থেকে সংস্থায় ইউনি-দিকনির্দেশক ম্যাপিং।
2) সংস্থা থেকে শাখায় দ্বি-দিকনির্দেশ ম্যাপিং।
3) সংস্থা থেকে শাখায় কেবল ইউনি-দিকনির্দেশক ম্যাপিং।

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



@Entity
public class Company {

@OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
@JoinColumn(name="courseId")
private List<Branch> branches;
...
}

এটি বলে যে শাখার টেবিলে বিদেশী কী "কোর্সআইডি" ম্যাপিংয়ের ভিত্তিতে আমাকে সমস্ত শাখার তালিকা পান get দ্রষ্টব্য: আপনি এক্ষেত্রে শাখা থেকে সংস্থা আনতে পারবেন না, কেবলমাত্র এক-দিকনির্দেশক ম্যাপিং সংস্থা থেকে অন্য শাখায় বিদ্যমান।

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