হাইবারনেট টিকা - কোনটি ভাল, ক্ষেত্র বা সম্পত্তির অ্যাক্সেস?


134

এই প্রশ্নটি কিছুটা হাইবারনেট অ্যানোটেশন প্লেসমেন্ট প্রশ্নের সাথে সম্পর্কিত ।

তবে আমি জানতে চাই কোনটি ভাল ? বৈশিষ্ট্যগুলির মাধ্যমে অ্যাক্সেস বা ক্ষেত্রের মাধ্যমে অ্যাক্সেস? প্রতিটি সুযোগসুবিধা এবং অসুবিধেও কি কি?

উত্তর:


33

আমি অ্যাক্সেসরগুলিকে পছন্দ করি, যেহেতু আমার যখনই প্রয়োজন হয় আমি আমার অ্যাক্সেসরে কিছু ব্যবসায়িক যুক্তি যুক্ত করতে পারি। এখানে একটি উদাহরণ:

@Entity
public class Person {

  @Column("nickName")
  public String getNickName(){
     if(this.name != null) return generateFunnyNick(this.name);
     else return "John Doe";
  }
}

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


17
নোট করুন এটি কীভাবে ORM আপনার ক্ষেত্র / বৈশিষ্ট্যগুলিকে অ্যাক্সেস করে এবং আপনার অ্যাপ্লিকেশন কোডটি নয় about ফিল্ড অ্যাক্সেসের সাথে আপনার getNickName () পদ্ধতিটি আপনার প্রত্যাশা মতো ঠিক কাজ করবে। আপনি যদি বাহ্যিক গেটার / সেটটারগুলির বাইরে অবিচ্ছিন্ন 'বৈশিষ্ট্য' ব্যবহার করেন তবে একই কথাটি সত্য নয়। এই স্থানে আপনি সম্পত্তি অ্যাক্সেস এবং অলস লোডিংয়ের সাথে সমস্যার সমাধান করতে পারেন। সুতরাং না, আমি সাধারণভাবে এই যুক্তির সাথে একমত নই। যাইহোক, গতবার আমি পরীক্ষণ করেছিলাম যে হাইবারনেটকে @ আইডি ক্ষেত্রের ক্ষেত্র অ্যাক্সেস নিয়ে সমস্যা রয়েছে।
রব বাইগ্রাভ

11
এই উত্তর প্রশ্নের সাথে সম্পর্কিত নয়। ডুফিমো দ্বারা সেরা উত্তর
জেনিং

9
অ্যাক্সেসরদের ভিতরে কোনও ব্যবসার যুক্তি থাকা উচিত নয়। এটা সুস্পষ্ট আচরণ নয়।
iurisusuk

কেন এই প্রতিক্রিয়া চিহ্নটি সঠিক? আপনি ক্ষেত্রের ম্যাপিং করতে পারেন এবং এটি একইভাবে একটি সেটার / গেটর সরবরাহ করতে পারবেন তা সত্য নয়।
লুক্কে

246

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

হাইবারনেট / জেপিএ আসলে কোনও কাজ করে যখন এটি কোনও বস্তুর অবিচল থাকে - ভাল, এটি বস্তুর স্টেট স্থির করে চলেছে। এর অর্থ এটি এটিকে এমনভাবে সংরক্ষণ করা হয় যাতে এটি সহজেই পুনরুত্পাদন করা যায়।

এনক্যাপসুলেশন কী? এনক্যাপসুলেশনগুলির অর্থ হল অ্যাপ্লিকেশন / ক্লায়েন্টটি নিরাপদে ডেটা অ্যাক্সেস করতে ব্যবহার করতে পারে এমন একটি ইন্টারফেসের সাথে ডেটা (বা রাজ্য) encapsulate করে - এটি ধারাবাহিক এবং বৈধ রাখে।

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

অবজেক্টের অভ্যন্তরীণ অবস্থার সংরক্ষণ করে এনক্যাপসুলেশন ভাঙবে না - অন্যথায় আপনি সত্যই বুঝতে পারবেন না এনক্যাপসুলেশনটির অর্থ কী, এবং কেন এটি বিদ্যমান। এটি ঠিক যেমন বস্তু সিরিয়ালাইজেশনের মতো is

এই কারণে, বেশিরভাগ ক্ষেত্রে, অ্যাক্সেসরগুলি না করে FIELDS বজায় রাখা উপযুক্ত। এর অর্থ হ'ল কোনও বস্তু সঠিকভাবে ডাটাবেস থেকে ঠিক সেভাবে তৈরি করা যায় ঠিক যেমনভাবে এটি সংরক্ষণ করা হয়েছিল। এটির কোনও বৈধতার প্রয়োজন হবে না, কারণ এটি তৈরির সময় এটি মূল কাজটি হয়েছিল এবং এটি ডাটাবেসে সংরক্ষণের আগে (যদি না Godশ্বর না করেন, আপনি ডিবিতে অবৈধ ডেটা সংরক্ষণ করছেন !!!!)। তেমনি, মানগুলি গণনা করার দরকার নেই, কারণ বস্তুটি সংরক্ষণের আগে সেগুলি ইতিমধ্যে গণনা করা হয়েছিল। সংরক্ষণ করার আগে অবজেক্টটি ঠিক সেভাবে দেখতে হবে। প্রকৃতপক্ষে, গেটার্স / সেটারগুলিতে অতিরিক্ত জিনিস যুক্ত করে আপনি আসলে ঝুঁকি বাড়িয়ে তুলছেন যে আপনি এমন কোনও কিছু পুনরায় তৈরি করবেন যা মূলটির যথাযথ অনুলিপি নয়।

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


9
সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের উত্তর: অ্যাকসেসরগুলি ব্যবহার করা ডিআরওয়াই লঙ্ঘন করে।
সোর্সডেলিকা

1
@ মার্টিন আপনার উত্তরের শেষ অনুচ্ছেদ সম্পর্কে আমার একটি ফলো-আপ প্রশ্ন রয়েছে। আপনি লিখেছেন "একটি উদাহরণ হতে পারে আপনি গণনা করা মান স্থির রাখতে এড়াতে চান"। সম্পত্তি ভিত্তিক অ্যাক্সেসের মাধ্যমে আপনি কীভাবে কোনও গণনা করা মান এড়াতে পারবেন? আমি জানি আপনি এটি না করার জন্য তর্ক করছেন তবে আমি এখানে পয়েন্টটি পাচ্ছি না। আপনি দয়া করে ব্যাখ্যা করতে পারেন?
গীক

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

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

5
@ এলনুর আবদুররাখিমভ আমরা সেখানে যাচ্ছি, একটি চমৎকার উদাহরণ। ধন্যবাদ।
মার্টিন

79

আমি ক্ষেত্রের অ্যাক্সেস পছন্দ করি, কারণ এইভাবে আমি প্রতিটি সম্পত্তির জন্য গেটর / সেটটার সরবরাহ করতে বাধ্য হই না।

গুগলের মাধ্যমে একটি দ্রুত সমীক্ষা পরামর্শ দেয় যে ক্ষেত্রের অ্যাক্সেস সংখ্যাগরিষ্ঠ (যেমন, http://java.dzone.com/tips/12-feb-jpa-20-w--cesstype )।

আমি বিশ্বাস করি যে ফিল্ড অ্যাক্সেস হ'ল স্প্রিংয়ের দ্বারা প্রস্তাবিত প্রতিমা, তবে আমি এটির পিছনে কোনও রেফারেন্স পাই না।

একটি সম্পর্কিত এসও প্রশ্ন রয়েছে যা কার্য সম্পাদন পরিমাপ করার চেষ্টা করেছিল এবং এই সিদ্ধান্তে পৌঁছেছিল যে "কোনও পার্থক্য নেই"।


আপনি যদি সত্তায় সেটার গেটর সরবরাহ না করেন তবে সেই ক্ষেত্রটি কী ব্যবহার করবে ... আপনি অ্যাপ্লিকেশনটিতে নতুনভাবে এটি ব্যবহার করতে পারবেন না, কারণ ক্ষেত্রগুলি ব্যক্তিগত
আনুষুলকত্ত

1
আপনার ক্ষেত্রগুলি খারাপ অভ্যাসের জন্য কোনও গেটর এবং সেটার সরবরাহ করছে না ?, আমার ধারণা এখানে আমার মন্তব্যটি সর্বদা সঠিক নয়, যেহেতু আমি একটি পাবলিক ফিল্ড ধরে নিই, যদিও এটি সম্ভবত একটি ব্যক্তিগত ক্ষেত্র হতে পারে যা কখনও অ্যাক্সেস হয় না।
ম্যাথিজস সেগার্স

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

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

তাই না। এই ক্ষেত্রে "অ্যান্টি-প্যাটার্ন" মতামতের বিষয়, ডগমা নয়। এর সাথে, ফিল্ড অ্যাক্সেস এখনও পছন্দসই। আরও ভাল ধারণাটি সম্পূর্ণরূপে ORM সমাধানগুলি থেকে দূরে সরে যাওয়া। সঠিক এসকিউএল লিখতে শিখুন।
ডাফাইমো

38

এখানে এমন একটি পরিস্থিতি রয়েছে যেখানে আপনি সম্পত্তি অ্যাক্সেসর ব্যবহার করতে পারেন। কল্পনা করুন যে আপনার 8 টি কংক্রিট সাবক্লাসে উত্তীর্ণ হওয়ার জন্য প্রচুর বাস্তবায়নের ধার্মিকতা সহ একটি জেনেরিক অ্যাবস্ট্রাক্ট শ্রেণি রয়েছে:

public abstract class Foo<T extends Bar> {

    T oneThing;
    T anotherThing;

    // getters and setters ommited for brevity

    // Lots and lots of implementation regarding oneThing and anotherThing here
 }

এখন ঠিক কীভাবে আপনার এই ক্লাসটি বর্ননা করা উচিত? উত্তরটি হ'ল আপনি এটিকে ক্ষেত্র বা সম্পত্তি অ্যাক্সেসের মাধ্যমে মোটেই টিকিয়ে রাখতে পারবেন না কারণ আপনি এই মুহুর্তে লক্ষ্য সত্তা নির্দিষ্ট করতে পারবেন না। আপনার কাছে কংক্রিটের বাস্তবায়নগুলি বর্নিত করতে হবে। তবে যেহেতু অবিচ্ছিন্ন বৈশিষ্ট্যগুলি এই সুপারক্লাসে ঘোষণা করা হয়েছে, তাই আপনাকে অবশ্যই সাবক্লাসে সম্পত্তি অ্যাক্সেস ব্যবহার করা উচিত।

অ্যাবস্ট্রাক্ট জেনেরিক সুপার-ক্লাস সহ কোনও অ্যাপ্লিকেশনে ফিল্ড অ্যাক্সেস কোনও বিকল্প নয়।


2
Touche। আমি এটা ভাবিনি। আমি বাজি ধরেছি হাইবারনেট এগুলির জন্য কিছু ক্রেজি স্কল বের করে।
জোসেফ লাস্ট

8
এই সমস্যাটি বৈশিষ্ট্যগুলি উল্লেখ না করে সমাধান করা যান্ত্রিকভাবে কঠিন বলে মনে হয়, তবে আমি কখনও এমন একটি ঘটনার দিকে যাইনি যেখানে আমার প্রচুর প্রয়োগের সাথে একটি বিমূর্ত জেনেরিক ক্লাসের প্রয়োজন ছিল যা আমিও বজায় রাখতে চেয়েছিলাম। সাধারণত আমি আমার অবজেক্টটি বহুতল করে তোলার জন্য একটি শ্রেণিবিন্যাস তৈরি করি (যা এটি সাধারণভাবে বিরতি তৈরি করে), কেবলমাত্র কোড পুনরায় ব্যবহারের জন্য নয়। এবং "প্রচুর এবং প্রচুর বাস্তবায়ন" প্রায়শই যাইহোক এসআরপি লঙ্ঘন করে, সেক্ষেত্রে আমি সম্ভবত এটি পৃথক শ্রেণিতে স্থানান্তর করব would এমন কোন দৃ concrete় উদাহরণ রয়েছে যা এই ব্যবহারের ক্ষেত্রে আরও স্পষ্ট করে তোলে?
মের্লিন মরগান-গ্রাহাম

আমার কাছে একমাত্র
দৃ concrete়

3
আপনি ব্যবহার করতে পারেন abstract T getOneThing(), এবং abstract void setOneThing(T thing), এবং ক্ষেত্র অ্যাক্সেস ব্যবহার করতে পারেন ।
আর্টুরো ভলপ

33

আমি সম্পত্তি অ্যাক্সেসর পছন্দ করতে এবং ব্যবহার করতে ঝোঁক:

  • প্রয়োজন দেখা দিলে আমি যুক্তি যুক্ত করতে পারি (গ্রহণযোগ্য উত্তরে উল্লিখিত)।
  • এটি আমাকে foo.getId() প্রক্সি শুরু না করে কল করার অনুমতি দেয় (হাইবারনেট ব্যবহারের সময় গুরুত্বপূর্ণ, এইচএইচএইচ -৩18১ resolved সমাধান না হওয়া পর্যন্ত )।

অপূর্ণতা:

  • এটি কোডটি কম পঠনযোগ্য করে তোলে, উদাহরণস্বরূপ আপনার @Transientচারপাশে রয়েছে কিনা তা দেখতে একটি সম্পূর্ণ ক্লাস ব্রাউজ করতে হবে।

তবে আপনি যদি এমন কোনও জেপিএ সরবরাহকারী ব্যবহার করেন যার "প্রক্সি" না থাকে তবে আপনার সেই সমস্যা নেই যেমন ওরফে "আপনার জেপিএ সরবরাহকারী আপনার উপর চাপিয়ে দিচ্ছেন"।
নীল স্টকটন

13

এটি সত্যিই একটি নির্দিষ্ট কেসের উপর নির্ভর করে - উভয় বিকল্প কোনও কারণে উপলব্ধ। আইএমও এটি তিনটি ক্ষেত্রে ফোটায়:

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

আমি হাইবারনেটে নতুন এবং একই প্রশ্নের সাথে লড়াই করছি। আমি মনে করি এই পোস্টটি সবচেয়ে পরিষ্কার উত্তর প্রদান করে। ধন্যবাদ.
স্যাম লেভিন

12

যদি আপনি সেটারগুলিতে সুনির্দিষ্টভাবে মান নির্ধারণ না করে (যেমন এনক্রিপশন বা গণনা) এর চেয়ে আরও কিছু করতে চান তবে আমি ক্ষেত্রের অ্যাক্সেস এবং প্রেরকদের (সম্পত্তি অ্যাক্সেস) এ টীকা দেওয়ার জন্য দৃ recommend়ভাবে সুপারিশ করব।

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

ফিল্ড অ্যাক্সেস এবং সম্পত্তি অ্যাক্সেসের মধ্যে পার্থক্যটি স্মরণ না করা পর্যন্ত এটি আমার মাথা ব্যাথার কারণ হয়ে দাঁড়িয়েছে। এখন আমি সম্পত্তি থেকে অ্যাক্সেস থেকে ক্ষেত্রের অ্যাক্সেসে আমার সমস্ত টীকাগুলি সরিয়ে নিয়েছি এবং এটি এখন দুর্দান্ত কাজ করে।


হ্যাঁ - আমি খুঁজে পেয়েছি যে আপনি যদি সম্পত্তির অ্যাক্সেস ব্যবহার করেন তবে ক্ষেত্রের মান সেট করা ছাড়াও আপনি সত্যই আপনার সেটে কিছু করতে পারবেন না।
এইচডিউভ

2
+1 গিটার / সেটারগুলি থেকে দূরে রাখুন। আমি প্রকল্পলম্বোক.অর্গ ব্যবহার করি এবং তাদের বিকাশকারীদের থেকে গোপন রাখি ।
ভ্যানটল

11

আমি নিম্নলিখিত কারণে ফিল্ড অ্যাক্সেস ব্যবহার পছন্দ করি:

  1. সম্পত্তি এক্সেস যখন সমান / হ্যাশকোড বাস্তবায়ন ও খুব কদর্য বাগ হতে পারে সরাসরি ক্ষেত্র উল্লেখ (যেমন তাদের getters মাধ্যমে বিরোধিতা)। এর কারণ হ'ল গ্রাহকগণ অ্যাক্সেস করা হয় তখনই প্রক্সিটি আরম্ভ করা হয় এবং সরাসরি ক্ষেত্রের অ্যাক্সেসটি শূন্য হয়ে যায়।

  2. সম্পত্তি এক্সেস সব টীকা করতে হবে ইউটিলিটি পদ্ধতি (যেমন addChild / removeChild) হিসেবে @Transient

  3. ক্ষেত্রের অ্যাক্সেসের সাথে আমরা কোনও গেটরকে একেবারেই প্রকাশ না করে @ সংস্করণ ক্ষেত্রটি আড়াল করতে পারি। একজন গেটরও সেটার যুক্ত করতে পারে এবং versionক্ষেত্রটি কখনই ম্যানুয়ালি সেট করা উচিত নয় (যা খুব বাজে সমস্যার দিকে নিয়ে যেতে পারে)। সমস্ত সংস্করণ বৃদ্ধিকরণটি OPTIMISTIC_FORCE_INCREMENT বা PESSIMISTIC_FORCE_INCREMENT স্পষ্ট লকিংয়ের মাধ্যমে ট্রিগার করা উচিত ।


1. ক্ষেত্রের অ্যাক্সেস কৌশল কীভাবে এটি প্রতিরোধ করে? এটি অ্যাক্সেস শৈলী নির্বিশেষে প্রক্সিগুলির সাথে একটি সাধারণ বিপত্তি বলে মনে হচ্ছে। ২. আপনি কি নিশ্চিত, এটি কি কেবল ইউটিলিটি গ্রাহক হওয়া উচিত? (তবে যাইহোক একটি ভাল তর্ক)। 3. জন্য দেশবাসীর কাছে মুখোশ উম্মোচন accessors versionক্ষেত্র যা DTOs বিচ্ছিন্ন সত্ত্বা পরিবর্তে ব্যবহার করা হয় পরিস্থিতিতে প্রায়ই দরকারী।
ড্রাগন বোজনোভিক

1. যখন প্রক্সিটি আরম্ভ হয় of 2. 100% নিশ্চিত। ৩. এটি একটি বৈধ পয়েন্ট।
ভ্লাদ মিহলসিয়া

আমার অজ্ঞতা এবং পাঠ্য ব্যাখ্যার সম্ভাব্য অভাবকে ক্ষমা করুন, (আমি কোনও স্থানীয় ইংরেজী স্পিকার নেই)। কেবল স্পষ্ট করে বলার জন্য, ক্ষেত্রের অ্যাক্সেস হ'ল যখন কোনও গেটার / সেটার পদ্ধতির সঠিক প্রয়োজন হয় না, তাই কোনও পজোর জন্য, এটি সামগ্রিকভাবে ব্যবহৃত হয়, ক্ষেত্রগুলি সর্বজনীন? তবে আপনি প্রথম বিষয়ে কিছু বলছেন এবং লিঙ্কযুক্ত ব্লগ পোস্টটি তার বিপরীতে বলে। আমি যা বুঝলাম তা হ'ল প্রক্সি এবং ক্ষেত্রের অ্যাক্সেস ব্যবহারের সময় আপনি সমান ব্যবহার করতে পারবেন না।
মাইকোআইডি

না। ক্ষেত্র অ্যাক্সেসের অর্থ হিবারনেট সত্ত্বার বৈশিষ্ট্যগুলি পড়ার জন্য প্রতিচ্ছবিগুলির মাধ্যমে ক্ষেত্রগুলি ব্যবহার করে। আরও বিশদের জন্য হাইবারনেট ব্যবহারকারী নির্দেশিকায় অ্যাক্সেস প্রকার বিভাগটি দেখুন ।
ভ্লাদ মিহলসিয়া

7

আমি মনে করি সম্পত্তিটি বর্ণনা করা আরও ভাল কারণ ক্ষেত্রগুলি আপডেট করা সরাসরি এনক্যাপসুলেশনটি ভেঙে দেয়, এমনকি আপনার ORM এটি করার পরেও।

এটি যেখানে আপনাকে পুড়িয়ে ফেলবে তার একটি দুর্দান্ত উদাহরণ এখানে: আপনি সম্ভবত একই স্থানে হাইবারনেট যাচাইকারী এবং অধ্যবসায়ের জন্য আপনার টীকাগুলি চান (ক্ষেত্র বা সম্পত্তি) either যদি আপনি আপনার হাইবারনেট ভ্যালিডেটর চালিত বৈধতা যা ক্ষেত্রটিতে টীকায়িত হয় তা পরীক্ষা করতে চান, আপনি নিজের ইউনিট পরীক্ষাটি কেবল বৈধকারীর কাছে বিচ্ছিন্ন করতে আপনার সত্তার একটি মক ব্যবহার করতে পারবেন না। সেকি।


2
এজন্য আপনি ক্ষেত্রগুলিতে অ্যাক্সেসরগুলিতে এবং অধ্যবসায়-টীকাগুলিতে বৈধতা-টীকাগুলি রাখেন
ফিশবোন

6

আমি বিশ্বাস করি সম্পত্তি অ্যাক্সেস বনাম ক্ষেত্রের অ্যাক্সেস অলস প্রারম্ভিকরণের ক্ষেত্রে মোটামুটি আলাদা।

2 বেসিক মটরশুটি জন্য নিম্নলিখিত ম্যাপিং বিবেচনা করুন:

<hibernate-mapping package="org.nkl.model" default-access="field">
  <class name="FieldBean" table="FIELD_BEAN">
    <id name="id">
      <generator class="sequence" />
    </id>
    <property name="message" />
  </class>
</hibernate-mapping>

<hibernate-mapping package="org.nkl.model" default-access="property">
  <class name="PropBean" table="PROP_BEAN">
    <id name="id">
      <generator class="sequence" />
    </id>
    <property name="message" />
  </class>
</hibernate-mapping>

এবং নিম্নলিখিত ইউনিট পরীক্ষা:

@Test
public void testFieldBean() {
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    FieldBean fb = new FieldBean("field");
    Long id = (Long) session.save(fb);
    tx.commit();
    session.close();

    session = sessionFactory.openSession();
    tx = session.beginTransaction();
    fb = (FieldBean) session.load(FieldBean.class, id);
    System.out.println(fb.getId());
    tx.commit();
    session.close();
}

@Test
public void testPropBean() {
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    PropBean pb = new PropBean("prop");
    Long id = (Long) session.save(pb);
    tx.commit();
    session.close();

    session = sessionFactory.openSession();
    tx = session.beginTransaction();
    pb = (PropBean) session.load(PropBean.class, id);
    System.out.println(pb.getId());
    tx.commit();
    session.close();
}

প্রয়োজনীয় নির্বাচনের মধ্যে আপনি সূক্ষ্ম পার্থক্য দেখতে পাবেন:

Hibernate: 
    call next value for hibernate_sequence
Hibernate: 
    insert 
    into
        FIELD_BEAN
        (message, id) 
    values
        (?, ?)
Hibernate: 
    select
        fieldbean0_.id as id1_0_,
        fieldbean0_.message as message1_0_ 
    from
        FIELD_BEAN fieldbean0_ 
    where
        fieldbean0_.id=?
0
Hibernate: 
    call next value for hibernate_sequence
Hibernate: 
    insert 
    into
        PROP_BEAN
        (message, id) 
    values
        (?, ?)
1

যে, কলিং fb.getId()একটি নির্বাচন প্রয়োজন, যেখানে pb.getId()না।


এটা মজার! :) তবে এটি একটি বাস্তবায়ন-নির্দিষ্ট আচরণ, আমি নিশ্চিত। আমি
ভ্লাদিমির ডিউজেভ

হ্যাঁ, আমার ধারণা এটি কেবল ধ্রুবক শ্রেণীরাই চালিত হয় to তবে এটি অত্যন্ত দুঃখজনক কারণ আইডি ক্ষেত্রটি প্রায়শই এমন এক ক্ষেত্র যার কোনও ব্যবসায়িক মূল্য থাকে না এবং কোনও প্রবেশকারীর প্রয়োজন হয় না।
মরিস পেরি

6

ফিল্ড-ভিত্তিক অ্যাক্সেস চয়ন করার জন্য সবচেয়ে গুরুত্বপূর্ণ কারণগুলি সংক্ষিপ্ত করার চেষ্টা করি Let আপনি যদি আরও গভীরভাবে ডুব দিতে চান তবে দয়া করে আমার ব্লগে এই নিবন্ধটি পড়ুন: জেপিএ এবং হাইবারনেটে অ্যাক্সেস কৌশলগুলি - কোনটি ভাল, ক্ষেত্র বা সম্পত্তির অ্যাক্সেস?

ক্ষেত্র-ভিত্তিক অ্যাক্সেস এখন পর্যন্ত আরও ভাল বিকল্প। এটির জন্য এখানে 5 টি কারণ রয়েছে:

কারণ 1: আপনার কোডের আরও ভাল পঠনযোগ্যতা

আপনি যদি ক্ষেত্র-ভিত্তিক অ্যাক্সেস ব্যবহার করেন, আপনি আপনার ম্যাপিং টীকা সহ আপনার সত্তার বৈশিষ্ট্যগুলি টিকিয়ে দিন। আপনার শ্রেণীর শীর্ষে সমস্ত সত্তা বৈশিষ্ট্যের সংজ্ঞা স্থাপন করে আপনি সমস্ত বৈশিষ্ট্য এবং তাদের ম্যাপিংয়ের তুলনামূলকভাবে কমপ্যাক্ট ভিউ পাবেন।

কারণ 2: ওমিট গিটার বা সেটার পদ্ধতিগুলি যা আপনার অ্যাপ্লিকেশন দ্বারা কল করা উচিত নয়

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

কারণ 3: গিটার এবং সেটার পদ্ধতিগুলির নমনীয় বাস্তবায়ন

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

উদাহরণস্বরূপ, আপনি এটি একটি alচ্ছিক সমিতি মোড়ানোর জন্য বা জাভাতে অ্যাট্রিবিউট ব্যবহার করতে পারেন Optional

কারণ 4: ইউটিলিটি পদ্ধতি হিসাবে চিহ্নিত করার প্রয়োজন নেই @Transient

ক্ষেত্র-ভিত্তিক অ্যাক্সেস কৌশলটির আরেকটি সুবিধা হ'ল আপনাকে আপনার ইউটিলিটি পদ্ধতিগুলির সাথে বেনিফিট করতে হবে না @Transient। এই টীকাটি আপনার অধ্যবসায় সরবরাহকারীকে বলে যে কোনও পদ্ধতি বা বৈশিষ্ট্য সত্তা স্থির অবস্থার অংশ নয়। এবং ক্ষেত্রের ধরণের অ্যাক্সেসের সাথে অবিচ্ছিন্ন অবস্থাটি আপনার সত্তার বৈশিষ্ট্যগুলি দ্বারা সংজ্ঞায়িত হয়ে যায়, আপনার জেপিএ বাস্তবায়ন আপনার সত্তার সমস্ত পদ্ধতি উপেক্ষা করে।

কারণ 5: প্রক্সিগুলির সাথে কাজ করার সময় বাগগুলি এড়িয়ে চলুন

হাইবারনেট অলসভাবে অ্যাসোসিয়েশনগুলিতে আনার জন্য প্রক্সি ব্যবহার করে যাতে এটি এই সমিতিগুলির সূচনা নিয়ন্ত্রণ করতে পারে। এই পদ্ধতির প্রায় সব পরিস্থিতিতেই কাজ করে। আপনি যদি সম্পত্তি-ভিত্তিক অ্যাক্সেস ব্যবহার করেন তবে এটি একটি বিপজ্জনক ক্ষতি হতে পারে।

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


3

ডিফল্টরূপে, জেপিএ সরবরাহকারী সত্তা ক্ষেত্রের মানগুলিতে অ্যাক্সেস করে এবং সত্তার জাভা বিয়ান প্রপার্টি অ্যাক্সেসার (গেটর) এবং মিউটেটর (সেটার) পদ্ধতি ব্যবহার করে সেই ক্ষেত্রগুলিকে ডাটাবেস কলামগুলিতে ম্যাপ করে। এই হিসাবে, কোনও সত্তায় ব্যক্তিগত ক্ষেত্রের নাম এবং প্রকারগুলি জেপিএর সাথে কোনও গুরুত্ব দেয় না। পরিবর্তে, জেপিএ জাভাবিয়ান সম্পত্তি অ্যাক্সেসরগুলির কেবল নাম এবং ফেরতের প্রকারগুলি দেখায়। আপনি @javax.persistence.Accessটীকাটি ব্যবহার করে এটি পরিবর্তন করতে পারেন , যা আপনাকে স্পষ্টভাবে JPA সরবরাহকারী নিয়োগ করা উচিত এমন অ্যাক্সেস পদ্ধতিটি নির্দিষ্ট করতে সক্ষম করে।

@Entity
@Access(AccessType.FIELD)
public class SomeEntity implements Serializable
{
...
}

অ্যাক্সেসটাইপ এনামের জন্য উপলভ্য বিকল্পগুলি হ'ল প্রোপার্টি (ডিফল্ট) এবং ফিল্ড। PROPERTY এর সাথে, সরবরাহকারী জাভাবিয়ান সম্পত্তি পদ্ধতিগুলি ব্যবহার করে ক্ষেত্রের মানগুলি নির্ধারণ করে এবং সেট করে। FIELD সরবরাহকারীগুলিকে উদাহরণ ক্ষেত্রগুলি ব্যবহার করে ক্ষেত্রের মানগুলি সেট এবং সেট করে তোলে। সেরা অনুশীলন হিসাবে, আপনার কেবলমাত্র ডিফল্টটিকে আটকে থাকা এবং জাভাবিয়ান বৈশিষ্ট্যগুলি ব্যবহার করা উচিত যদি না আপনার অন্যথায় করার বাধ্যতামূলক কারণ না থাকে।

আপনি ব্যক্তিগত ক্ষেত্র বা পাবলিক অ্যাকসেসর পদ্ধতিতে এই সম্পত্তি টীকাগুলি রাখতে পারেন। আপনি যদি AccessType.PROPERTYজাভাবিয়ান অ্যাকসেসরের পরিবর্তে ব্যক্তিগত ক্ষেত্রগুলি (ডিফল্ট) ব্যবহার করে এবং টীকায়িত করেন তবে ক্ষেত্রের নামগুলি অবশ্যই জাভাবিয়ান সম্পত্তি নামের সাথে মেলে। তবে আপনি জাভাবিয়ান অ্যাক্সেসরগুলি টিকিয়ে রাখলে নামগুলি মেলাতে হবে না। তেমনিভাবে, আপনি যদি AccessType.FIELDক্ষেত্রগুলির পরিবর্তে জাভাবিয়ান অ্যাক্সেসরগুলি ব্যবহার করেন এবং এনারোটেট করেন তবে ফিল্ডের নামগুলি অবশ্যই জাভাবিয়ান সম্পত্তি নামের সাথে মিলে যাবে। এই ক্ষেত্রে, আপনি যদি ক্ষেত্রগুলি টিকিয়ে রাখেন তবে তাদের মিলতে হবে না। জাভাবিয়ান অ্যাক্সেসরগুলির জন্য AccessType.PROPERTYএবং এর জন্য ক্ষেত্রগুলিকে কেবল সামঞ্জস্যপূর্ণ এবং টীকায়িত করা ভাল AccessType.FIELD

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


2

আমরা কি এখনও সেখানে আছি?

এটি একটি পুরানো উপস্থাপনা তবে রড পরামর্শ দেয় যে সম্পত্তি অ্যাক্সেসে টিকাটি অ্যানিমিক ডোমেন মডেলগুলিকে উত্সাহ দেয় এবং এটিকে বেনিফিট করার "ডিফল্ট" উপায় হওয়া উচিত নয়।


2

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

সুতরাং আমি সুরক্ষিত ক্ষেত্রগুলি হিসাবে ডিফল্ট কনস্ট্রাক্টরের খালি বাস্তবায়ন শুরু করে এবং কেবলমাত্র তাদের প্রাপ্তকারীদেরই প্রকাশ করতে পছন্দ করি হিসাবে সংগ্রহগুলি পছন্দ করি। মত তারপর, শুধুমাত্র পরিচালিত অপারেশন clear(), remove(), removeAll()ইত্যাদি সম্ভবত হাইবারনেট পরিবর্তনের অবিদিত করতে হবে না হয়।


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

2

আমি ক্ষেত্রগুলিকে পছন্দ করি তবে আমি এমন একটি পরিস্থিতির মধ্যে চলে এসেছি যা দেখে মনে হয় যে আমাকে গ্রাহকদের উপরে টীকাগুলি রাখতে বাধ্য করা হবে।

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


2

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

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

এই অ্যাপ্লিকেশনটিতে হাইবারনেট সংস্করণ ব্যবহৃত হয়েছে:

<!-- hibernate -->
<hibernate-core.version>3.3.2.GA</hibernate-core.version>
<hibernate-annotations.version>3.4.0.GA</hibernate-annotations.version>
<hibernate-commons-annotations.version>3.1.0.GA</hibernate-commons-annotations.version>
<hibernate-entitymanager.version>3.4.0.GA</hibernate-entitymanager.version>

2

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


1

হাইবারনেটে অ্যাক্সেসটাইপ সম্পর্কিত আমার একই প্রশ্ন ছিল এবং এখানে কিছু উত্তর পাওয়া গেল ।



1

আমরা সত্তা মটরশুটি তৈরি করেছি এবং গেটর এনোটেশন ব্যবহার করেছি। আমরা যে সমস্যার মধ্যে পড়েছিলাম তা হ'ল: কিছু সত্তাগুলি কখন আপডেট হতে পারে সে সম্পর্কে কিছু সম্পত্তি সম্পর্কিত জটিল নিয়ম রয়েছে। সমাধানটি ছিল প্রতিটি সেটারে কিছু ব্যবসায়িক যুক্তি যা কিনা নির্ধারণ করে যে আসল মানটি পরিবর্তন হয়েছে কিনা এবং যদি তাই হয় তবে পরিবর্তনের অনুমতি দেওয়া উচিত কিনা। অবশ্যই, হাইবারনেট সর্বদা বৈশিষ্ট্যগুলি সেট করতে পারে তাই আমরা দুটি গ্রুপ সেটারের সাথে শেষ করেছি। সুন্দর অসুন্দর.

পূর্ববর্তী পোস্টগুলি পড়া, আমি আরও দেখতে পেলাম যে সত্তার অভ্যন্তর থেকে বৈশিষ্ট্যগুলি উল্লেখ করার ফলে সংগ্রহগুলি লোড না হওয়ায় সমস্যা হতে পারে।

নীচের লাইন, আমি ভবিষ্যতে ক্ষেত্রগুলি টীকা দেওয়ার দিকে ঝুঁকবো।


0

সাধারণত মটরশুটিগুলি POJO হয়, সুতরাং তাদের যাইহোক অ্যাক্সেসর রয়েছে।

সুতরাং প্রশ্নটি "কোনটি আরও ভাল?" নয়, তবে কেবল "কখন ক্ষেত্রের অ্যাক্সেস ব্যবহার করবেন?"। এবং উত্তরটি হল "যখন আপনাকে ক্ষেত্রের জন্য সেটার / গেটারের প্রয়োজন হবে না!"।


4
সমস্যাটি হ'ল আপনি কোনও পোজোর ক্ষেত্রে ক্ষেত্রের অ্যাক্সেস এবং সম্পত্তি অ্যাক্সেসের মিশ্রণ করতে পারবেন না - আপনাকে একটি চয়ন করতে হবে
মার্টিন ওকনোর

সত্যি? আমি অবশ্যই এটি ভুলে গেছি। যাইহোক, আমি সর্বদা POJO an d অ্যাকসেসর ব্যবহার করি।
ভ্লাদিমির ডিউজেভ

নোট করুন যে জেপিএ ২.০ এর সাথে (যা এই প্রশ্ন জিজ্ঞাসা করার সময় ছিল না) আপনি এখন @ অ্যাক্সেসটাইপ টিকাটি ব্যবহার করে অ্যাক্সেসের ধরণের মিশ্রণ করতে পারেন।
এমটিপটিটিপ

0

আমি এটি সম্পর্কে চিন্তাভাবনা করছি এবং আমি পদ্ধতি অ্যাকসেসর চয়ন করি

কেন?

কারণ ক্ষেত্র এবং মেথোস অ্যাকসেসর সমান তবে পরে যদি আমার লোড ক্ষেত্রে কিছু যুক্তি প্রয়োজন তবে আমি ক্ষেত্রগুলিতে রাখা সমস্ত টিকা সংরক্ষণ করি

শুভেচ্ছা

Grubhart


0

আপনার ক্লাসগুলি আরও পরিষ্কার করে দেওয়ার জন্য, ক্ষেত্রটিতে টীকাগুলি রাখুন তারপরে @ অ্যাক্সেস (অ্যাক্সেসটাইপ.প্রপ্রেটি) ব্যবহার করুন


0

উভয়:

EJB3 স্পেসের প্রয়োজন হয় যে আপনি যে উপাদানটি অ্যাক্সেস করতে পারবেন তার প্রকারে টীকাগুলি ঘোষণা করুন, অর্থাত্ যদি আপনি সম্পত্তির অ্যাক্সেস ব্যবহার করেন, তবে ক্ষেত্রের অ্যাক্সেস ব্যবহার করেন field

https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping


0

অ্যাক্সেসটাইপ.প্রযুক্তি: ইজেবি অধ্যবসায় বাস্তবায়ন জাভাবিয়ান "সেটার" পদ্ধতিগুলির মাধ্যমে আপনার শ্রেণিতে স্টেট লোড করবে এবং জাভাবিয়ান "গেটর" পদ্ধতিগুলি ব্যবহার করে আপনার শ্রেণি থেকে রাষ্ট্র পুনরুদ্ধার করবে। এটি ডিফল্ট।

অ্যাক্সেসটাইপ.ফিল্ড: রাজ্যটি আপনার শ্রেণীর ক্ষেত্রগুলি থেকে সরাসরি লোড এবং পুনরুদ্ধার করা হয়। আপনাকে জাভাবিয়ান "গেটরস" এবং "সেটার" লিখতে হবে না।

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