আমার কোন টিকাটি ব্যবহার করা উচিত: @ আইডক্লাস বা @ এম্বেডডইড


128

JPA(জাভা অধ্যবসায় API এর) স্পেসিফিকেশন সত্তা যৌগিক কী নির্দিষ্ট করার 2 বিভিন্ন উপায় আছে: @IdClassএবং @EmbeddedId

আমি আমার ম্যাপযুক্ত সত্তাগুলিতে উভয় টীকাগুলি ব্যবহার করছি, তবে এটি খুব পরিচিত না এমন লোকদের কাছে একটি বড় জগাখিচুড়ি হয়ে দেখা দেয় JPA

সম্মিলিত কীগুলি নির্দিষ্ট করার জন্য আমি কেবল একটি উপায় অবলম্বন করতে চাই। কোনটি সত্যই সেরা? কেন?

উত্তর:


86

আমি @EmbeddedIdসম্ভবত এটি আরও ভারবোজ হিসাবে বিবেচনা করছি কারণ আপনার সাথে @IdClassকোনও ফিল্ড অ্যাক্সেস অপারেটর ব্যবহার করে পুরো প্রাথমিক কী বস্তুটি অ্যাক্সেস করতে পারবেন না। এটি ব্যবহার করে @EmbeddedIdআপনি এটি করতে পারেন:

@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
  @EmbeddedId EmployeeId employeeId;
  ...
}

এটি ক্ষেত্রগুলির একটি পরিষ্কার ধারণা দেয় যা যৌগিক কী তৈরি করে কারণ তারা সকলেই একটি ক্লাসে সংযুক্ত যা ক্ষেত্রের অ্যাক্সেস অপারেটরকে প্রবাহিত করে।

এইচকিউএল লেখার ক্ষেত্রে এর সাথে @IdClassআর একটি পার্থক্য রয়েছে @EmbeddedId:

সঙ্গে @IdClassআপনি লিখুন:

কর্মচারী থেকে e.name নির্বাচন করুন

এবং আপনার সাথে @EmbeddedIdলিখতে হবে:

কর্মচারী e থেকে e.employeeId.name নির্বাচন করুন

একই ক্যোয়ারির জন্য আপনাকে আরও পাঠ্য লিখতে হবে। কেউ কেউ যুক্তি দিতে পারেন যে এটি প্রচারিত ভাষার মতো আরও প্রাকৃতিক ভাষা থেকে পৃথক IdClass। তবে প্রদত্ত ক্ষেত্রটি সংমিশ্রিত কীটির অংশ বলে জিজ্ঞাসা করা থেকে বেশিরভাগ সময়ই অমূল্য সহায়তা হয়।


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

1
আমি মনে করি যে এটি সম্ভব যে @IdClass@ গৌরব প্রদত্ত টীকাগুলি ব্যবহারের ক্ষেত্রে জেপিএ স্পেসিফিকেশন একটি যৌগিক কী তৈরির উভয় পদ্ধতিকে তালিকাভুক্ত করেছে .. @IdClassএবং@EmbeddidId
কাপাড

20

একটি যৌগিক প্রাথমিক কী ব্যবহার করার জন্য তিনটি কৌশল রয়েছে:

  • এটি হিসাবে চিহ্নিত @Embeddableকরুন এবং এটির জন্য চিহ্নিত হিসাবে আপনার সত্তা শ্রেণিতে এটির জন্য একটি সাধারণ সম্পত্তি যুক্ত করুন @Id
  • আপনার সত্তা শ্রেণিতে এটির জন্য চিহ্নিত একটি সাধারণ সম্পত্তি যুক্ত করুন @EmbeddedId
  • আপনার সত্তা শ্রেণীর সমস্ত ক্ষেত্রের জন্য বৈশিষ্ট্য যুক্ত করুন, সেগুলি চিহ্নিত করুন @Idএবং @IdClassআপনার প্রাথমিক কী শ্রেণীর শ্রেণি সরবরাহ করে আপনার সত্তা শ্রেণিকে চিহ্নিত করুন ।

@Idচিহ্নিত শ্রেণীর সাথে ব্যবহার করা @Embeddableসবচেয়ে প্রাকৃতিক পদ্ধতি। @Embeddableট্যাগ অ প্রাথমিক কী এম্বেডযোগ্য মানের জন্য যাহাই হউক না কেন ব্যবহার করা যাবে। এটি আপনাকে যৌগিক প্রাথমিক কীটিকে একক সম্পত্তি হিসাবে বিবেচনা করার অনুমতি দেয় এবং এটি @Embeddableঅন্যান্য সারণীতে শ্রেণীর পুনরায় ব্যবহারের অনুমতি দেয় ।

পরবর্তী সবচেয়ে প্রাকৃতিক পদ্ধতি হ'ল @EmbeddedIdট্যাগ ব্যবহার । এখানে, প্রাথমিক কী শ্রেণিটি অন্য সারণীতে ব্যবহার করা যাবে না কারণ এটি কোনও @Embeddableসত্তা নয়, তবে এটি আমাদের কীটিকে কিছু শ্রেণির একক বৈশিষ্ট্য হিসাবে বিবেচনা করে।

শেষ অবধি, @IdClassএবং @Idটীকাগুলির ব্যবহার আমাদের প্রাথমিক কী শ্রেণীর বৈশিষ্ট্যগুলির নামের সাথে সত্তার বৈশিষ্ট্যগুলি ব্যবহার করে যৌগিক প্রাথমিক কী শ্রেণীর মানচিত্র তৈরি করতে দেয় to নামগুলি অবশ্যই মিলবে (এটিকে ওভাররাইড করার কোনও ব্যবস্থা নেই), এবং প্রাথমিক কী শ্রেণিকে অবশ্যই অন্য দুটি কৌশল হিসাবে একই দায়িত্ব পালন করতে হবে। এই পদ্ধতির একমাত্র সুবিধা হ'ল সংযুক্তি সত্তার ইন্টারফেস থেকে প্রাথমিক কী শ্রেণীর ব্যবহার "আড়াল" করার দক্ষতা। @IdClassটীকা ক্লাস ধরনের একটি মান পরামিতি, যা বর্গ যৌগ প্রাথমিক কী হিসাবে ব্যবহার করা যেতে হতে হবে লাগে। যে ক্ষেত্রগুলি প্রাথমিক কী শ্রেণীর বৈশিষ্ট্যগুলির সাথে মিলিত হবে সেগুলি অবশ্যই এগুলিতে টীকাযুক্ত করা উচিত @Id

তথ্যসূত্র: http://www.apress.com/us/book/9781430228509


17

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


13

আমি যতদূর জানি আপনার যৌগিক পিকে যদি এফকে থাকে তবে এটি ব্যবহার করা সহজ এবং আরও সহজ @IdClass

সঙ্গে @EmbeddedIdআপনি দুইবার আপনার এফ কে কলামের জন্য ম্যাপিং সংজ্ঞায়িত করতে, onece আছে @Embeddedableএবং একবার যেমন অর্থাত জন্য @ManyToOneযেখানে @ManyToOne(শুধুমাত্র পাঠযোগ্য করা হয়েছে @PrimaryKeyJoinColumn) কারণ আপনার দুটি ভেরিয়েবল (সম্ভাব্য দ্বন্দ্ব) এ একটি কলাম সেট থাকতে পারে না।
সুতরাং আপনাকে সাধারণ টাইপ ব্যবহার করে আপনার এফকে সেট করতে হবে @Embeddedable

ওয়ানটোয়েন এবং ম্যান্টিটোইন সম্পর্কের মাধ্যমে প্রাথমিক কীগুলিতে@IdClass প্রদর্শিত এই পরিস্থিতিটি ব্যবহার করে অন্য সাইটটিকে আরও সহজভাবে পরিচালনা করা যেতে পারে :

উদাহরণস্বরূপ জেপিএ ২.০ অনেকগুলি আইডি টীকা

...
@Entity
@IdClass(PhonePK.class)
public class Phone {

    @Id
    private String type;

    @ManyToOne
    @Id
    @JoinColumn(name="OWNER_ID", referencedColumnName="EMP_ID")
    private Employee owner;
    ...
}

উদাহরণস্বরূপ জেপিএ ২.০ আইডি ক্লাস

...
public class PhonePK {
    private String type;
    private long owner;

    public PhonePK() {}

    public PhonePK(String type, long owner) {
        this.type = type;
        this.owner = owner;
    }

    public boolean equals(Object object) {
        if (object instanceof PhonePK) {
            PhonePK pk = (PhonePK)object;
            return type.equals(pk.type) && owner == pk.owner;
        } else {
            return false;
        }
    }

    public int hashCode() {
        return type.hashCode() + owner;
    }
}

1
শুধু আপনার পিকে ক্লাসে গেটার যুক্ত করতে ভুলবেন না
সোনাটা

@ সোনাটা আমাদের কেন দরকার? আমি কোনও গেটার /
সেটটার

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

8

আমি মনে করি মূল সুবিধাটি হ'ল আমরা @GeneratedValueযখন আইডিটি ব্যবহার করতে @IdClassপারি তখন ? আমি মনে করি আমরা ব্যবহার করতে পারবেন না আছি @GeneratedValueজন্য @EmbeddedId


1
এম্বেডডেডে জেনারেটেডভ্যালু ব্যবহার করা কি সম্ভব নয় ??
কায়সার 8

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

4

সম্মিলিত কী ব্যবহার করার @Idসময় কোনও সম্পত্তি থাকতে হবে না @EmbeddedId


1

এম্বেডডইডের সাহায্যে আপনি এইচকিউএল-তে আইএন ক্লজটি ব্যবহার করতে পারেন, উদাহরণস্বরূপ: FROM Entity WHERE id IN :idsযেখানে আইডি একটি এম্বেডডইড যেখানে আইডক্লাসের সাথে একই ফলাফল অর্জন করতে ব্যথা হয় আপনি যেমন কিছু করতে চাইবেনFROM Entity WHERE idPartA = :idPartA0 AND idPartB = :idPartB0 .... OR idPartA = :idPartAN AND idPartB = :idPartBN

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