দ্বিদলীয় জেপিএ ওয়ানটোম্যানি / ম্যান্টিটোইনের সমিতিতে "সমিতির বিপরীত দিক" কী?


167

@OneToManyজেপিএ টিকা রেফারেন্সের উদাহরণ বিভাগে :

উদাহরণ 1-59 @ ওনটোমনে - জেনারিক্স সহ গ্রাহক শ্রেণি

@Entity
public class Customer implements Serializable {
    ...
    @OneToMany(cascade=ALL, mappedBy="customer")
    public Set<Order> getOrders() { 
        return orders; 
    }
    ...
}

উদাহরণ 1-60 @ মানি টোওনে - জেনারিকসের সাথে ক্লাস অর্ডার করুন

@Entity
public class Order implements Serializable {
    ...
    @ManyToOne
    @JoinColumn(name="CUST_ID", nullable=false)
    public Customer getCustomer() { 
        return customer; 
    }
    ...
}

আমার কাছে মনে হয় Customerসত্তাটি সমিতির মালিক। তবে, mappedByএকই নথিতে গুণাবলীর ব্যাখ্যাতে , এটি লিখিত আছে:

যদি সম্পর্কটি দ্বি নির্দেশমূলক হয়, তবে উদাহরণস্বরূপ 1-60 শো হিসাবে সম্পর্কের মালিকানা ক্ষেত্র বা সম্পত্তির নামে মেল্পবাই উপাদানটিকে সংযুক্তির বিপরীত (অ-মালিকানা) পাশের অংশে সেট করুন।

যাইহোক, আমি যদি ভুল না হই তবে উদাহরণস্বরূপ দেখতে এটির মতো মনে mappedByহয়, প্রকৃতপক্ষে অ-মালিকানার পক্ষের চেয়ে সমিতির মালিকানাধীন অংশে নির্দিষ্ট করা হয়েছে।

সুতরাং আমার প্রশ্নটি মূলত:

  1. দ্বিপাক্ষিক (এক-একাধিক / বহু-থেকে-এক) সমিতিতে, কোন সত্তার মালিক? আমরা কীভাবে এক পক্ষকে মালিক হিসাবে মনোনীত করতে পারি? আমরা কীভাবে বহু পক্ষকে মালিক হিসাবে মনোনীত করতে পারি?

  2. "সমিতির বিপরীত দিক" বলতে কী বোঝায়? আমরা কীভাবে এক পক্ষকে বিপরীতমুখী হিসাবে মনোনীত করতে পারি? আমরা কীভাবে বহু পক্ষকে বিপরীতমুখী হিসাবে মনোনীত করতে পারি?


1
আপনার প্রদত্ত লিঙ্কটি পুরানো। আপডেট করুন.
মার্টিনএল

উত্তর:


306

এটি বুঝতে, আপনাকে অবশ্যই একটি পদক্ষেপ নিতে হবে। ওওতে, গ্রাহক অর্ডারগুলির মালিক (আদেশগুলি গ্রাহক বস্তুর একটি তালিকা) কোনও গ্রাহক ছাড়া কোনও অর্ডার থাকতে পারে না। সুতরাং গ্রাহক আদেশগুলির মালিক বলে মনে করছেন।

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

এটি বুঝতে সাহায্য করতে পারে:

public class Customer {
     // This field doesn't exist in the database
     // It is simulated with a SQL query
     // "OO speak": Customer owns the orders
     private List<Order> orders;
}

public class Order {
     // This field actually exists in the DB
     // In a purely OO model, we could omit it
     // "DB speak": Order contains a foreign key to customer
     private Customer customer;
}

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

আর একটি সাধারণ উদাহরণ হ'ল নোডযুক্ত গাছ যা পিতা-মাতা এবং শিশু উভয়ই হতে পারে। এই ক্ষেত্রে, দুটি ক্ষেত্র একটি শ্রেণিতে ব্যবহৃত হয়:

public class Node {
    // Again, this is managed by Hibernate.
    // There is no matching column in the database.
    @OneToMany(cascade = CascadeType.ALL) // mappedBy is only necessary when there are two fields with the type "Node"
    private List<Node> children;

    // This field exists in the database.
    // For the OO model, it's not really necessary and in fact
    // some XML implementations omit it to save memory.
    // Of course, that limits your options to navigate the tree.
    @ManyToOne
    private Node parent;
}

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

এই পদ্ধতির উপরেরটির চেয়ে আরও নমনীয় (এটি সহজেই এক-থেকে-এক, বহু-এক-এক, এক-থেকে-বহু এবং এমনকি বহু-থেকে-বহু-লোককেও পরিচালনা করতে পারে)। দাম যে

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

এজন্য আমি খুব কমই এই পদ্ধতির প্রস্তাব দিই।


36
কেবল পরিষ্কার করতে: অনেক দিকের মালিক; এক দিকটি বিপরীত। আপনার পছন্দ নেই (ব্যবহারিকভাবে বলতে))
জন

11
না, হাইবারনেট এটি আবিষ্কার করেছে। এটি ওও মডেলটিতে বাস্তবায়নের অংশটি প্রকাশ করার কারণে এটি পছন্দ করি না। আমি সংযোগটির অর্থ কী তা বোঝাতে "XtoY" এর পরিবর্তে একটি @Parentবা @Childটীকাটি পছন্দ করতাম (এটি কীভাবে প্রয়োগ করা হয় তার চেয়ে বেশি )
অ্যারন ডিগুল্লা

4
@ অ্যারোনডিগুল্লা প্রতিবারই আমাকে এই উত্তরটি পড়তে আসতে ওয়ানটোমনি ম্যাপিংয়ের মধ্য দিয়ে যেতে হবে, সম্ভবত এসও-তে এই বিষয়টির সেরা।
ইউজিন

7
কি দারুন. যদি কেবল ওআরএম ফ্রেমওয়ার্কের ডকুমেন্টেশনের এত ভাল ব্যাখ্যা থাকে - এটি পুরো জিনিসটিকে গ্রাস করা সহজ করে তুলবে! দুর্দান্ত উত্তর!
নিক

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

41

অবিশ্বাস্যভাবে, 3 বছরে কেউই সম্পর্কের মানচিত্রের দুটি উপায়ের উদাহরণ দিয়ে আপনার দুর্দান্ত প্রশ্নের উত্তর দেয়নি।

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

// "One" Customer owns the associated orders by storing them in a customer_orders join table
public class Customer {
    @OneToMany(cascade = CascadeType.ALL)
    private List<Order> orders;
}

// if the Customer owns the orders using the customer_orders table,
// Order has no knowledge of its Customer
public class Order {
    // @ManyToOne annotation has no "mappedBy" attribute to link bidirectionally
}

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

// "One" Customer as the inverse side of the relationship
public class Customer {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
    private List<Order> orders;
}

// "many" orders each own their pointer to a Customer
public class Order {
    @ManyToOne
    private Customer customer;
}

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

1
উবার-সম্পূর্ণ হতে, আপনি দ্বিপাক্ষিক ক্ষেত্রে দেখাতে পারেন যেখানে গ্রাহক সম্পর্কের নিজস্ব দিক রয়েছে।
এইচডিভে

35

ডাটাবেসে বিদেশী কী সহ সারণী রয়েছে এমন সত্তা হ'ল তার নিজস্ব সত্তা এবং অন্য টেবিলটি, যার দিকে লক্ষ্য করা হচ্ছে, এটি বিপরীত সত্তা।


30
এমনকি সহজ: মালিক এফকে কলাম সহ টেবিল
জ্যাকট্রেডস

2
সহজ এবং ভাল ব্যাখ্যা। যে কোনও পক্ষের মালিক করা যায়। যদি আমরা গ্রাহক ক্ষেত্রে <অর্ডার.জভাতে ম্যাপডবাই ব্যবহার করি তবে <কাস্টমআর.জভা থেকে ম্যাপডবাই সরান> তবে একটি নতুন টেবিলটি অর্ডার_কাস্টমারের মতো এমন কিছু তৈরি করা হবে যাতে 2 টি কলাম থাকবে। ORDER_ID এবং CUSTOMER_ID।
হাকুনামাতাটা

14

দ্বি নির্দেশমূলক সম্পর্কের সহজ নিয়ম:

একাধিক দ্বিপক্ষীয় সম্পর্কের জন্য, অনেক দিকই সবসময় সম্পর্কের নিজস্ব দিক। উদাহরণ: 1 কক্ষে অনেক ব্যক্তি রয়েছে (একজন ব্যক্তি কেবলমাত্র একটি কক্ষের অন্তর্ভুক্ত) -> মালিকানার পক্ষ ব্যক্তি

২.এক-থেকে-এক দ্বিপাক্ষিক সম্পর্কের জন্য, নিজস্ব দিকটি সেই পাশের সাথে সামঞ্জস্য করে যার সাথে সম্পর্কিত বিদেশী কী রয়েছে।

৩. বহু-বহু-দ্বিমুখী সম্পর্কের জন্য, উভয় পক্ষই নিজস্ব পক্ষ হতে পারে।

আশা আপনাকে সাহায্য করতে পারে।


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

3

দুটি সত্তা শ্রেণীর গ্রাহক এবং আদেশের জন্য, হাইবারনেট দুটি টেবিল তৈরি করবে।

সম্ভাব্য কেস:

  1. ম্যাপডবাই কাস্টোমার.জেভা এবং অর্ডার.জভা ক্লাসে তখন ব্যবহার হয় না ->

    গ্রাহকের পক্ষে একটি নতুন টেবিল তৈরি করা হবে [নাম = CUSTOMER_ORDER] যা CUSTOMER_ID এবং ORDER_ID এর ম্যাপিং রাখবে। এগুলি গ্রাহক এবং আদেশ সারণীর প্রাথমিক কীগুলি। অর্ডার সাইডে সংশ্লিষ্ট গ্রাহক_আইডি রেকর্ড ম্যাপিংটি সংরক্ষণ করতে অতিরিক্ত কলামের প্রয়োজন।

  2. কাস্টোমিমার জাভাতে ম্যাপডবি ব্যবহার করা হয় [সমস্যার বিবরণীতে দেওয়া আছে] এখন অতিরিক্ত টেবিল [CUSTOMER_ORDER] তৈরি হয় না। অর্ডার সারণীতে কেবল একটি কলাম

  3. অর্ডার.জভাতে ম্যাপডবি ব্যবহার করা হয়েছে এখন হাইবারনেট দ্বারা অতিরিক্ত টেবিল তৈরি করা হবে [

যে কোনও পক্ষই সম্পর্কের মালিক হতে পারে। তবে এটি xxxToOne পার্শ্ব চয়ন করা আরও ভাল better

কোডিংয়ের প্রভাব -> সত্তার একমাত্র মালিকানার পক্ষই সম্পর্কের স্থিতি পরিবর্তন করতে পারে। নীচের উদাহরণে বয়ফ্রেন্ড শ্রেণি সম্পর্কের মালিক। এমনকি গার্লফ্রেন্ড যদি ব্রেক আপ করতে চায় তবে সে পারবে না।

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "BoyFriend21")
public class BoyFriend21 {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Boy_ID")
    @SequenceGenerator(name = "Boy_ID", sequenceName = "Boy_ID_SEQUENCER", initialValue = 10,allocationSize = 1)
    private Integer id;

    @Column(name = "BOY_NAME")
    private String name;

    @OneToOne(cascade = { CascadeType.ALL })
    private GirlFriend21 girlFriend;

    public BoyFriend21(String name) {
        this.name = name;
    }

    public BoyFriend21() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BoyFriend21(String name, GirlFriend21 girlFriend) {
        this.name = name;
        this.girlFriend = girlFriend;
    }

    public GirlFriend21 getGirlFriend() {
        return girlFriend;
    }

    public void setGirlFriend(GirlFriend21 girlFriend) {
        this.girlFriend = girlFriend;
    }
}

import org.hibernate.annotations.*;
import javax.persistence.*;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.ArrayList;
import java.util.List;

@Entity 
@Table(name = "GirlFriend21")
public class GirlFriend21 {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Girl_ID")
    @SequenceGenerator(name = "Girl_ID", sequenceName = "Girl_ID_SEQUENCER", initialValue = 10,allocationSize = 1)
    private Integer id;

    @Column(name = "GIRL_NAME")
    private String name;

    @OneToOne(cascade = {CascadeType.ALL},mappedBy = "girlFriend")
    private BoyFriend21 boyFriends = new BoyFriend21();

    public GirlFriend21() {
    }

    public GirlFriend21(String name) {
        this.name = name;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public GirlFriend21(String name, BoyFriend21 boyFriends) {
        this.name = name;
        this.boyFriends = boyFriends;
    }

    public BoyFriend21 getBoyFriends() {
        return boyFriends;
    }

    public void setBoyFriends(BoyFriend21 boyFriends) {
        this.boyFriends = boyFriends;
    }
}


import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.Arrays;

public class Main578_DS {

    public static void main(String[] args) {
        final Configuration configuration = new Configuration();
         try {
             configuration.configure("hibernate.cfg.xml");
         } catch (HibernateException e) {
             throw new RuntimeException(e);
         }
        final SessionFactory sessionFactory = configuration.buildSessionFactory();
        final Session session = sessionFactory.openSession();
        session.beginTransaction();

        final BoyFriend21 clinton = new BoyFriend21("Bill Clinton");
        final GirlFriend21 monica = new GirlFriend21("monica lewinsky");

        clinton.setGirlFriend(monica);
        session.save(clinton);

        session.getTransaction().commit();
        session.close();
    }
}

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.List;

public class Main578_Modify {

    public static void main(String[] args) {
        final Configuration configuration = new Configuration();
        try {
            configuration.configure("hibernate.cfg.xml");
        } catch (HibernateException e) {
            throw new RuntimeException(e);
        }
        final SessionFactory sessionFactory = configuration.buildSessionFactory();
        final Session session1 = sessionFactory.openSession();
        session1.beginTransaction();

        GirlFriend21 monica = (GirlFriend21)session1.load(GirlFriend21.class,10);  // Monica lewinsky record has id  10.
        BoyFriend21 boyfriend = monica.getBoyFriends();
        System.out.println(boyfriend.getName()); // It will print  Clinton Name
        monica.setBoyFriends(null); // It will not impact relationship

        session1.getTransaction().commit();
        session1.close();

        final Session session2 = sessionFactory.openSession();
        session2.beginTransaction();

        BoyFriend21 clinton = (BoyFriend21)session2.load(BoyFriend21.class,10);  // Bill clinton record

        GirlFriend21 girlfriend = clinton.getGirlFriend();
        System.out.println(girlfriend.getName()); // It will print Monica name.
        //But if Clinton[Who owns the relationship as per "mappedby" rule can break this]
        clinton.setGirlFriend(null);
        // Now if Monica tries to check BoyFriend Details, she will find Clinton is no more her boyFriend
        session2.getTransaction().commit();
        session2.close();

        final Session session3 = sessionFactory.openSession();
        session1.beginTransaction();

        monica = (GirlFriend21)session3.load(GirlFriend21.class,10);  // Monica lewinsky record has id  10.
        boyfriend = monica.getBoyFriends();

        System.out.println(boyfriend.getName()); // Does not print Clinton Name

        session3.getTransaction().commit();
        session3.close();
    }
}

1

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

রিলেশনাল ডাটাবেস সিস্টেমে কেবল তিন ধরণের টেবিল সম্পর্ক থাকতে পারে:

  • এক থেকে অনেকগুলি (একটি বিদেশী কী কলামের মাধ্যমে)
  • ওয়ান-টু-ওয়ান (একটি শেয়ার করা প্রাথমিক কী এর মাধ্যমে)
  • বহু-থেকে-বহু (দুটি বিদেশী কীগুলির সাথে দুটি পৃথক পিতামাতার টেবিলগুলি উল্লেখ করে একটি লিঙ্ক টেবিলের মাধ্যমে)

সুতরাং, একটি 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;

সুতরাং, আপনার দুটি পক্ষ রয়েছে যা সত্তা সমিতি পরিবর্তন করতে পারে:

  • commentsশিশু সংগ্রহে একটি এন্ট্রি যুক্ত করে একটি নতুন post_commentসারিটি postতার post_idকলামের মাধ্যমে প্যারেন্ট সত্তার সাথে যুক্ত করা উচিত ।
  • সত্তার postসম্পত্তি সেট করে PostComment, post_idকলামটিও আপডেট করা উচিত।

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

ম্যাপডবাই (ওরফে উল্টো দিক)

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পদ্ধতি নিশ্চিত করুন যে উভয় পক্ষের সুসংগত করা হয়। সুতরাং, আমরা যদি কোনও শিশু সত্তা যুক্ত করি তবে শিশু সত্তাকে পিতামাতাকে নির্দেশ করতে হবে এবং পিতা-মাতার সত্তাকে সন্তানের সংগ্রহের মধ্যে অন্তর্ভুক্ত করা উচিত।

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

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