কেউ জেপিএ এবং হাইবারনেটে ম্যাপডবি দ্বারা ব্যাখ্যা করতে পারেন?


175

আমি হাইবারনেটে নতুন এবং এক থেকে একাধিক এবং বহু থেকে একের সম্পর্ক ব্যবহার করা দরকার need এটি আমার বস্তুর মধ্যে দ্বি-দিকনির্দেশক সম্পর্ক, যাতে আমি উভয় দিক থেকে অতিক্রম করতে পারি। mappedByএটি সম্পর্কে প্রস্তাবিত উপায় হ'ল, তবে আমি এটি বুঝতে পারি না। কেউ ব্যাখ্যা করতে পারেন:

  • এটি ব্যবহারের প্রস্তাবিত উপায় কী?
  • এটি কোন উদ্দেশ্য সমাধান করে?

আমার উদাহরণের জন্য, এখানে টীকা সহ আমার ক্লাসগুলি রয়েছে:

  • Airline OWNS অনেক AirlineFlights
  • অনেক AirlineFlights অন্তর্গত এক Airline

এয়ারলাইন :

@Entity 
@Table(name="Airline")
public class Airline {
    private Integer idAirline;
    private String name;

    private String code;

    private String aliasName;
    private Set<AirlineFlight> airlineFlights = new HashSet<AirlineFlight>(0);

    public Airline(){}

    public Airline(String name, String code, String aliasName, Set<AirlineFlight> flights) {
        setName(name);
        setCode(code);
        setAliasName(aliasName);
        setAirlineFlights(flights);
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="IDAIRLINE", nullable=false)
    public Integer getIdAirline() {
        return idAirline;
    }

    private void setIdAirline(Integer idAirline) {
        this.idAirline = idAirline;
    }

    @Column(name="NAME", nullable=false)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = DAOUtil.convertToDBString(name);
    }

    @Column(name="CODE", nullable=false, length=3)
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = DAOUtil.convertToDBString(code);
    }

    @Column(name="ALIAS", nullable=true)
    public String getAliasName() {
        return aliasName;
    }
    public void setAliasName(String aliasName) {
        if(aliasName != null)
            this.aliasName = DAOUtil.convertToDBString(aliasName);
    }

    @OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
    @JoinColumn(name="IDAIRLINE")
    public Set<AirlineFlight> getAirlineFlights() {
        return airlineFlights;
    }

    public void setAirlineFlights(Set<AirlineFlight> flights) {
        this.airlineFlights = flights;
    }
}

AirlineFlights:

@Entity
@Table(name="AirlineFlight")
public class AirlineFlight {
    private Integer idAirlineFlight;
    private Airline airline;
    private String flightNumber;

    public AirlineFlight(){}

    public AirlineFlight(Airline airline, String flightNumber) {
        setAirline(airline);
        setFlightNumber(flightNumber);
    }

    @Id
    @GeneratedValue(generator="identity")
    @GenericGenerator(name="identity", strategy="identity")
    @Column(name="IDAIRLINEFLIGHT", nullable=false)
    public Integer getIdAirlineFlight() {
        return idAirlineFlight;
    }
    private void setIdAirlineFlight(Integer idAirlineFlight) {
        this.idAirlineFlight = idAirlineFlight;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="IDAIRLINE", nullable=false)
    public Airline getAirline() {
        return airline;
    }
    public void setAirline(Airline airline) {
        this.airline = airline;
    }

    @Column(name="FLIGHTNUMBER", nullable=false)
    public String getFlightNumber() {
        return flightNumber;
    }
    public void setFlightNumber(String flightNumber) {
        this.flightNumber = DAOUtil.convertToDBString(flightNumber);
    }
}

সম্পাদনা করুন:

ডাটাবেস স্কিমা:

এয়ারলাইন ফ্লাইটের আইডিএরলাইনটি ফরেনকে এবং এয়ারলাইনের কোনও আইডিএয়ারলাইন ফ্লাইট নেই। এটি তৈরি করে, সত্ত্বার মালিক / শনাক্তকরণ হিসাবে এয়ারলাইনফ্লাইটগুলি?

তাত্ত্বিকভাবে, আমি এয়ারলাইনটি এয়ারলাইন ফ্লাইটের মালিক হতে চাই।

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


151

@JoinColumnউভয় মডেলের উপর নির্দিষ্ট করে আপনার দ্বিপথের সম্পর্ক নেই। আপনার দুটি ওয়ান ওয়ে সম্পর্ক রয়েছে এবং এটির মধ্যে একটি বিভ্রান্তিকর ম্যাপিং। আপনি উভয় মডেলকে বলছেন যে তারা আইডিআরলাইন কলামটি "মালিকানাধীন"। সত্যিই কেবল তাদের একজনের উচিত! 'সাধারণ' জিনিসটি পুরোপুরি দিকটি @JoinColumnবন্ধ করে নেওয়া @OneToManyএবং তার পরিবর্তে ম্যাপডবাইটি এর সাথে যুক্ত করা @OneToMany

@OneToMany(cascade = CascadeType.ALL, mappedBy="airline")
public Set<AirlineFlight> getAirlineFlights() {
    return airlineFlights;
}

এটি হাইবারনেটকে বলে "কনফিগারেশনটি খুঁজে পাওয়ার জন্য আমার কাছে যে জিনিস রয়েছে তার উপর 'বিমান সংস্থা' নামের শিমের সম্পত্তিটি দেখুন" "


2
ম্যাপডবাই সম্পর্কে আপনার বর্ণনার শেষে আমি কিছুটা বিভ্রান্ত। বিষয়গুলি কীভাবে ডিবিতে সংগঠিত হয় তাতে কিছু যায় আসে না? @ ডিবি: এয়ারলাইনফ্লাইটস এর বিদেশী কী হিসাবে আইডিএরলাইন রয়েছে। এয়ারলাইনটিতে কেবল প্রাথমিক কী হিসাবে আইডিএয়ারলাইন রয়েছে এবং এয়ারলাইনফ্লাইটস @ ডিবি সম্পর্কে কোনও তথ্য নেই।
brainydexter

10
হ্যাঁ, এটা ব্যাপার। জয়যুক্ত কলামের জন্য কনফিগারেশনটি কোথায় পাওয়া যায় ম্যাপডবাইয়ের নামটি হাইবারনেটকে বলছে। (AirlineFlight পদ্ধতি getAirline () উপর।) আপনি এয়ারলাইন উপর JoinColumn নির্বাণ, আপনি এয়ারলাইন এটি বলছেন এটিকে ম্যাপ হয় অন্যান্য টেবিলে উপর মান বজায় রাখার জন্য দায়ী। কোনও সত্তাকে এটি আলাদা টেবিলে একটি কলামের "মালিকানাধীন" বলা সম্ভব এবং এটি আপডেট করার জন্য দায়বদ্ধ। এটি আপনি সাধারণত যা করতে চান তা নয় এবং এসকিউএল বিবৃতি কার্যকর করার ক্রম নিয়ে সমস্যা তৈরি করতে পারে।
এফফি

সম্পাদনা দেখুন। ডিবি স্তরে, এয়ারলাইনফ্লাইট টেবিলটি বিদেশী কী কলাম হিসাবে idAirline এর মালিক। সুতরাং, জয়েন্টক্লোকমটি সংশ্লিষ্ট মেন্তোঅনে এয়ারলাইনফ্লাইট শ্রেণি / টেবিলের উপর রাখা উচিত, যেহেতু এটি column কলামটির মালিক?
brainydexter

হ্যাঁ, আমি সেভাবে এটি করার পরামর্শ দেব। এটি সর্বনিম্ন জটিল বিকল্প এবং আপনার আর কোনও প্রয়োজন নেই বলে মনে হয়।
এফফি

"আপনি @OneToMany পাশ থেকে সম্পূর্ণরূপে @ জোইন কলামটি ছেড়ে যান" আপনি পাশটি বলতে চাচ্ছেন, তাই @ManyToOneনা?
nbro

284

ম্যাপডবাই হাইবারনেট সিগন্যাল করে যে সম্পর্কের চাবি অন্যদিকে রয়েছে other

এর অর্থ এই যে আপনি 2 টি টেবিলকে একসাথে লিঙ্ক করেছেন, তবে এই টেবিলগুলির মধ্যে কেবল 1 টির মধ্যে অন্য একটিতে বিদেশী কী বাধা রয়েছে। ম্যাপডবাই আপনাকে অন্য সারণীতে সীমাবদ্ধতা না থাকা সারণী থেকে এখনও লিঙ্ক করতে দেয়।


3
আপনি কি আরও কিছু স্পষ্ট করতে পারেন?
আলেকজান্ডার সুর্যাপেল

1
@ কুর্ট ডু বোইস, আপনি mappedByদ্বি-দিকনির্দেশনা সংজ্ঞায়িত করার পরিবর্তে (প্রতিটি দিকে বিদেশী_কি বাধার সাথে) ব্যবহার করবেন কেন ?
কেভিন মেরিডেথ

6
কারণ কখনও কখনও উভয় পক্ষের একটি চাবি লাগানোর কোনও অর্থ হয় না। উদাহরণস্বরূপ বলুন আপনার একটি সংস্থা এবং একটি বহনযোগ্য। একটি পোর্টেবল কেবল একটি সংস্থার অন্তর্ভুক্ত থাকবে তবে একটি সংস্থার একাধিক পোর্টেবল থাকবে।
কার্ট ডু বোইস

আমার উত্তরটি ঘুরিয়ে দেওয়ার জন্য সম্পাদনা লোকটির জন্য দুঃখিত, তবে আপনার সম্পাদনায় আসলে কোনও অতিরিক্ত মূল্য ছিল না। শেষ বাক্যটিও বোঝায় নি।
কুর্ট ডু বোইস

@ কুর্টডুবুইস এইভাবে ম্যাপ করা হয়েছে কীভাবে আপনার ডাটাবেস তৈরি করবেন তা চিত্রের মধ্যে আসে, যেমন হয় আপনি ম্যাপডবি ব্যবহার করছেন না জাভা দিকের হাইবারনেট একইভাবে আচরণ করছেন। এটা কি?

22

mappedbyএটি নিজের পক্ষে কথা বলে, এটি এই ক্ষেত্রটি মানচিত্র না করার হাইবারনেটকে বলে এটি ইতিমধ্যে এই ক্ষেত্রটি [নাম = "ক্ষেত্র"] দ্বারা ম্যাপযুক্ত।
ক্ষেত্রটি অন্য সত্তায় রয়েছে (name of the variable in the class not the table in the database)..

আপনি যদি এটি না করেন তবে হাইবারনেট এই দুটি সম্পর্কটিকে একই সম্পর্ক হিসাবে মানচিত্র করবে

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


ম্যাপডবি কি optionচ্ছিক? কারণ ম্যাপডবি ব্যবহার না করে আমি একই ফলস্বরূপ অর্থাৎ দ্বিদ্বিপার্শ্বিক অবজেক্ট ম্যাপিং পাচ্ছি
ফ্রিল্যান্সার

আপনি এক পাশ mappedBy ব্যবহার করতে হবে many2many জন্য পার্শ্ব একই জিনিস এক mappedBy ব্যবহার না করেই on2many এবং many2one ব্যবহার করতে পারবেন না
Charif ডি জেড

অন্যান্য টেবিলের ক্ষেত্রের নামটি বৈশিষ্ট্যটির মান কী তা বোঝানোর জন্য ধন্যবাদ।
গ্যাব 好人 好人

2
হতে পারে হাইবারনেট সর্বদা নিজের পক্ষে কথা বলে না, তবে যখন এটি হয়, কমপক্ষে এটি বিরামচিহ্ন ব্যবহার করে
আমালগোভিনাস

1
আমার জন্য, এটি নিজের পক্ষে কথা বলে না; বিপরীতভাবে, এটি খুব বিভ্রান্তিকর। প্রকৃতপক্ষে কী mappedByএবং কী সম্পর্কিত প্রশ্নগুলি কেবল তা দেখুন inversedBy। অন্যান্য ORM গুলি আরও বুদ্ধিমান belongsToMany, hasManyগুণাবলী ব্যবহার করে ।
জান বোদনার

12

ম্যাপডবি = "অন্য শ্রেণিতে তৈরি একই শ্রেণীর সত্তার অবজেক্ট"

দ্রষ্টব্য: - ম্যাপযুক্ত কেবলমাত্র একটি শ্রেণিতে ব্যবহার করা যেতে পারে কারণ একটি টেবিলটিতে অবশ্যই বিদেশী কী বাধা থাকতে পারে। যদি ম্যাপযুক্ত যদি উভয় পক্ষেই প্রয়োগ করা যায় তবে এটি উভয় টেবিল থেকে বিদেশী কী সরিয়ে ফেলবে এবং বিদেশী কী ছাড়াই বি / ডাব্লু দুটি টেবিলের কোনও সম্পর্ক নেই।

দ্রষ্টব্য: - এটি নীচের টীকাগুলির জন্য ব্যবহার করা যেতে পারে: - ১. @ ওয়ানটোন ২.

দ্রষ্টব্য --- এটি নীচের টীকাগুলির জন্য ব্যবহার করা যাবে না: - 1. @ ম্যান্টি টোওন

এক থেকে একটিতে: - ম্যাপিংয়ের যে কোনও দিকে পারফর্ম করুন তবে কেবলমাত্র একদিকে সঞ্চালন করুন। এটি কোন শ্রেণিতে এটি প্রয়োগ করা হবে তা টেবিলে থাকা বিদেশী কী বাধাগুলির অতিরিক্ত কলাম সরিয়ে ফেলবে।

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


12

সারণী সম্পর্ক বনাম সত্তা সম্পর্ক

রিলেশনাল ডাটাবেস সিস্টেমে একটি one-to-manyটেবিলের সম্পর্কটি নীচে দেখায়:

<কোড> একের মধ্যে অনেকগুলি </ কোড> টেবিলের সম্পর্ক

নোট করুন যে সম্পর্কটি post_idশিশু সারণীতে বিদেশী কী কলাম (যেমন, ) এর উপর ভিত্তি করে ।

সুতরাং, যখন কোনও one-to-manyটেবিলের সম্পর্কটি পরিচালনার কথা আসে তখন সত্যের একক উত্স থাকে ।

এখন, আপনি যদি দ্বি নির্দেশমূলক সত্তা সম্পর্কটি নেন যা one-to-manyসারণীর সম্পর্কের মানচিত্রগুলি আমরা আগে দেখেছি:

দ্বি নির্দেশমূলক <কোড> একাধিক </ কোড> সত্তা সমিতি

যদি আপনি উপরের চিত্রটি একবার দেখুন, আপনি দেখতে পারেন যে এই সম্পর্কটি পরিচালনা করার দুটি উপায় রয়েছে।

ইন Postসত্তা, আপনি commentsসংগ্রহ:

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

এবং, এর মধ্যে PostComment, postসমিতিটি ম্যাপ করা হয়েছে:

@ManyToOne(
    fetch = FetchType.LAZY
)
@JoinColumn(name = "post_id")
private Post post;

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

MappedBy

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

দ্বি দ্বি-নির্দেশমূলক সংস্থার উভয় পক্ষকে সিঙ্ক্রোনাইজ করুন ize

এখন, আপনি যদি mappedByএট্রিবিউটটি সংজ্ঞায়িত করেন এবং চাইল্ড-সাইড @ManyToOneঅ্যাসোসিয়েশন বিদেশী কী কলামটি পরিচালনা করে তবে আপনার দ্বিপাক্ষিক সংস্থার উভয় দিককেই সমন্বয় করতে হবে।

এটি করার সর্বোত্তম উপায় হ'ল এই দুটি ইউটিলিটি পদ্ধতি যুক্ত করা:

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

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

addCommentএবং removeCommentপদ্ধতি নিশ্চিত করুন যে উভয় পক্ষের সুসংগত করা হয়। সুতরাং, আমরা যদি কোনও শিশু সত্তা যুক্ত করি তবে শিশু সত্তাকে পিতামাতাকে নির্দেশ করতে হবে এবং পিতা-মাতার সত্তাকে সন্তানের সংগ্রহের মধ্যে অন্তর্ভুক্ত করা উচিত।

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


0

আপনি ম্যান্টি টোনে ম্যাপিং দিয়ে শুরু করেছেন, তারপরে আপনি দ্বি-দিকনির্দেশক উপায়ে ওয়ানটোম্যান ম্যাপিংও রেখেছেন। তারপরে ওয়ানটোমনে সাইডে (সাধারণত আপনার প্যারেন্ট টেবিল / ক্লাস) আপনাকে "ম্যাপডবাই" (ম্যাপিংটি চাইল্ড টেবিল / ক্লাস দ্বারা করা হয়) উল্লেখ করতে হবে, তাই হাইবারনেট ডিবিতে এক্সট্রা ম্যাপিং টেবিল তৈরি করবে না (যেমন টেবিলনেম = প্যারেন্ট_চাইল্ড)।

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