ম্যাপডবি দ্বারা একটি অজানা লক্ষ্য সত্তা সম্পত্তি রেফারেন্স


87

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

আমার নিম্নলিখিতগুলি রয়েছে:

@MappedSuperclass
public abstract class MappedModel
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id",nullable=false,unique=true)
    private Long mId;

তারপর এই

@Entity
@Table(name="customer")
public class Customer extends MappedModel implements Serializable
{

    /**
   * 
   */
  private static final long serialVersionUID = -2543425088717298236L;


  /** The collection of stores. */
    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  private Collection<Store> stores;

এবং এই

@Entity
@Table(name="store")
public class Store extends MappedModel implements Serializable
{

    /**
   * 
   */
  private static final long serialVersionUID = -9017650847571487336L;

  /** many stores have a single customer **/
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn (name="customer_id",referencedColumnName="id",nullable=false,unique=true)
  private Customer mCustomer;

আমি এখানে কি ভুল করছি

উত্তর:


151

mappedByঅ্যাট্রিবিউট উল্লেখ করছে customerযখন সম্পত্তি mCustomer, অত ত্রুটি বার্তা। সুতরাং হয় আপনার ম্যাপিং এ এতে পরিবর্তন করুন:

/** The collection of stores. */
@OneToMany(mappedBy = "mCustomer", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Collection<Store> stores;

অথবা সত্তার সম্পত্তিটি customer(যা আমি এটি করব) তে পরিবর্তন করুন।

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


এটি কাজ করেছিল, আমি প্রত্যাশা করেছি যে এটি প্রতিচ্ছবিটি কোনও সেটার বা গেটর পদ্ধতি ব্যবহার করবে এবং সরাসরি সম্পত্তিটি ব্যবহার করবে না।
boyd4715

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

ধন্যবাদ যে আমাকে অনেক সাহায্য করে
ওসামা আল-বান্না

11

আমি জানি @ প্যাসিকাল থিভেন্টের উত্তরটি সমস্যার সমাধান করেছে। যারা এই থ্রেডটি চালাচ্ছেন তাদের কাছে আমি তার জবাবটিতে আরও কিছু যুক্ত করতে চাই।

আপনি যদি @OneToMany' mappedBy' সম্পত্তির সাথে টীকাগুলি ব্যবহার করার ধারণাটি শিখতে এবং আপনার মাথাটি মুড়িয়ে দেওয়ার প্রথম দিনগুলিতে আমার মতো হয়ে থাকেন তবে এর অর্থ এটিও হ'ল যে @ManyToOneটীকাটি সহ অন্য পক্ষটি @JoinColumnএই দ্বি-দিকের দিকের 'মালিক' সম্পর্ক

এছাড়াও, mappedByলাগে উদাহরণস্বরূপ নাম ( mCustomerএকটি ইনপুট এবং যেমন ক্লাস ভেরিয়েবলের এই উদাহরণে মধ্যে) ক্লাস ওয়ান (: ক্রেতা প্রাক্তন) অথবা সত্তা নাম (উদা: গ্রাহকের)।

বোনাস: এছাড়াও, টীকা দেওয়ার orphanRemovalসম্পত্তিটি দেখুন @OneToMany। যদি এটি সত্য হিসাবে সেট করা থাকে, তবে যদি কোনও পিতামাতা দ্বি-দিকনির্দেশক সম্পর্কের মধ্যে মুছে ফেলা হয়, তবে হাইবারনেট স্বয়ংক্রিয়ভাবে তার শিশুদের মুছবে।


-1
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "USER_ID")
    Long userId;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL)
    List<Notification> sender;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL)
    List<Notification> receiver;
}

public class Notification implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id

    @Column(name = "NOTIFICATION_ID")
    Long notificationId;

    @Column(name = "TEXT")
    String text;

    @Column(name = "ALERT_STATUS")
    @Enumerated(EnumType.STRING)
    AlertStatus alertStatus = AlertStatus.NEW;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SENDER_ID")
    @JsonIgnore
    User sender;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "RECEIVER_ID")
    @JsonIgnore
    User receiver;
}

উত্তর থেকে কী বুঝলাম। ম্যাপেড = "প্রেরক" মানটি নোটিফিকেশন মডেলে একই হওয়া উচিত। আমি তোমাকে একটি উদাহরণ দিব..

ব্যবহারকারী মডেল:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "**sender**", cascade = CascadeType.ALL)
    List<Notification> sender;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "**receiver**", cascade = CascadeType.ALL)
    List<Notification> receiver;

বিজ্ঞপ্তি মডেল:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL)
    List<Notification> **sender**;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL)
    List<Notification> **receiver**;

আমি ব্যবহারকারী মডেল এবং বিজ্ঞপ্তি ক্ষেত্রে সাহসী ফন্ট দিয়েছি। ব্যবহারকারী মডেল ম্যাপডবাই = " প্রেরক " বিজ্ঞপ্তি তালিকা প্রেরকের সমান হতে হবে ; এবং ম্যাপডবাই = " রিসিভার " নোটিফিকেশন তালিকা রিসিভারের সমান হওয়া উচিত ; তা না হলে আপনি ত্রুটি পাবেন।

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