এই প্রশ্নটি কিছুটা হাইবারনেট অ্যানোটেশন প্লেসমেন্ট প্রশ্নের সাথে সম্পর্কিত ।
তবে আমি জানতে চাই কোনটি ভাল ? বৈশিষ্ট্যগুলির মাধ্যমে অ্যাক্সেস বা ক্ষেত্রের মাধ্যমে অ্যাক্সেস? প্রতিটি সুযোগসুবিধা এবং অসুবিধেও কি কি?
এই প্রশ্নটি কিছুটা হাইবারনেট অ্যানোটেশন প্লেসমেন্ট প্রশ্নের সাথে সম্পর্কিত ।
তবে আমি জানতে চাই কোনটি ভাল ? বৈশিষ্ট্যগুলির মাধ্যমে অ্যাক্সেস বা ক্ষেত্রের মাধ্যমে অ্যাক্সেস? প্রতিটি সুযোগসুবিধা এবং অসুবিধেও কি কি?
উত্তর:
আমি অ্যাক্সেসরগুলিকে পছন্দ করি, যেহেতু আমার যখনই প্রয়োজন হয় আমি আমার অ্যাক্সেসরে কিছু ব্যবসায়িক যুক্তি যুক্ত করতে পারি। এখানে একটি উদাহরণ:
@Entity
public class Person {
@Column("nickName")
public String getNickName(){
if(this.name != null) return generateFunnyNick(this.name);
else return "John Doe";
}
}
তদতিরিক্ত, যদি আপনি মিশ্রণে অন্য লিবস নিক্ষেপ করেন (কিছু জেএসওএন-রূপান্তরকারী লিব বা বিয়ানম্প্পার বা ডোজার বা অন্যান্য শিমের ম্যাপিং / গিটার / সেটার বৈশিষ্ট্যের উপর ভিত্তি করে ক্লোনিং লাইব) আপনার গ্যারান্টি থাকতে হবে যে এই লিবিটি অধ্যবসায়ের সাথে তাল মিলছে that ম্যানেজার (উভয় গেটর / সেটার ব্যবহার করে)।
উভয়ের পক্ষে যুক্তি রয়েছে, তবে তাদের বেশিরভাগ নির্দিষ্ট ব্যবহারকারীর প্রয়োজনীয়তা "যদি আপনার জন্য যুক্তি যুক্ত করতে হয় তবে" বা "এক্সএক্সএক্সএক্সএক্স ব্রেক এনক্র্যাপসুলেশন" থেকে আসে m যাইহোক, কেউই তত্ত্ব সম্পর্কে সত্যই মন্তব্য করেননি, এবং একটি যথাযথ যুক্তিযুক্ত যুক্তি দিয়েছেন।
হাইবারনেট / জেপিএ আসলে কোনও কাজ করে যখন এটি কোনও বস্তুর অবিচল থাকে - ভাল, এটি বস্তুর স্টেট স্থির করে চলেছে। এর অর্থ এটি এটিকে এমনভাবে সংরক্ষণ করা হয় যাতে এটি সহজেই পুনরুত্পাদন করা যায়।
এনক্যাপসুলেশন কী? এনক্যাপসুলেশনগুলির অর্থ হল অ্যাপ্লিকেশন / ক্লায়েন্টটি নিরাপদে ডেটা অ্যাক্সেস করতে ব্যবহার করতে পারে এমন একটি ইন্টারফেসের সাথে ডেটা (বা রাজ্য) encapsulate করে - এটি ধারাবাহিক এবং বৈধ রাখে।
এমএস ওয়ার্ডের মতো এটি ভাবুন। এমএস ওয়ার্ড নথিটির একটি মডেল মেমোরিতে রক্ষণাবেক্ষণ করে - নথিগুলি স্টেট। এটি একটি ইন্টারফেস উপস্থাপন করে যা ব্যবহারকারী দস্তাবেজটি সংশোধন করতে ব্যবহার করতে পারেন - বোতাম, সরঞ্জাম, কীবোর্ড কমান্ড ইত্যাদির একটি সেট ইত্যাদি যাইহোক, আপনি যখন এই নথিটি (সংরক্ষণ) অবিরত রাখতে চান, এটি অভ্যন্তরীণ অবস্থা সংরক্ষণ করে, কীপ্রেসের সেটটি নয় এবং এটি উত্পন্ন করতে ব্যবহৃত মাউস ক্লিকগুলি।
অবজেক্টের অভ্যন্তরীণ অবস্থার সংরক্ষণ করে এনক্যাপসুলেশন ভাঙবে না - অন্যথায় আপনি সত্যই বুঝতে পারবেন না এনক্যাপসুলেশনটির অর্থ কী, এবং কেন এটি বিদ্যমান। এটি ঠিক যেমন বস্তু সিরিয়ালাইজেশনের মতো is
এই কারণে, বেশিরভাগ ক্ষেত্রে, অ্যাক্সেসরগুলি না করে FIELDS বজায় রাখা উপযুক্ত। এর অর্থ হ'ল কোনও বস্তু সঠিকভাবে ডাটাবেস থেকে ঠিক সেভাবে তৈরি করা যায় ঠিক যেমনভাবে এটি সংরক্ষণ করা হয়েছিল। এটির কোনও বৈধতার প্রয়োজন হবে না, কারণ এটি তৈরির সময় এটি মূল কাজটি হয়েছিল এবং এটি ডাটাবেসে সংরক্ষণের আগে (যদি না Godশ্বর না করেন, আপনি ডিবিতে অবৈধ ডেটা সংরক্ষণ করছেন !!!!)। তেমনি, মানগুলি গণনা করার দরকার নেই, কারণ বস্তুটি সংরক্ষণের আগে সেগুলি ইতিমধ্যে গণনা করা হয়েছিল। সংরক্ষণ করার আগে অবজেক্টটি ঠিক সেভাবে দেখতে হবে। প্রকৃতপক্ষে, গেটার্স / সেটারগুলিতে অতিরিক্ত জিনিস যুক্ত করে আপনি আসলে ঝুঁকি বাড়িয়ে তুলছেন যে আপনি এমন কোনও কিছু পুনরায় তৈরি করবেন যা মূলটির যথাযথ অনুলিপি নয়।
অবশ্যই, এই কার্যকারিতাটি একটি কারণে যুক্ত করা হয়েছিল। অ্যাক্সেসরদের ধরে রাখার জন্য কিছু বৈধ ব্যবহারের মামলা থাকতে পারে, তবে এগুলি সাধারণত বিরল হবে। একটি উদাহরণ হতে পারে যে আপনি একটি গণনা করা মান স্থির রাখতে এড়াতে চান, যদিও আপনি এই প্রশ্নটি জিজ্ঞাসা করতে চাইতে পারেন যে আপনি কেন মূল্যটির গিটারের চাহিদা অনুসারে এটি গণনা করেন না বা আলস্যভাবে এটি প্রযোজকটিতে সূচনা করতে পারেন। ব্যক্তিগতভাবে আমি কোনও ভাল ব্যবহারের ক্ষেত্রে ভাবতে পারি না এবং এখানকার উত্তরগুলির মধ্যে সত্যই কোনও "সফ্টওয়্যার ইঞ্জিনিয়ারিং" উত্তর দেয় না।
আমি ক্ষেত্রের অ্যাক্সেস পছন্দ করি, কারণ এইভাবে আমি প্রতিটি সম্পত্তির জন্য গেটর / সেটটার সরবরাহ করতে বাধ্য হই না।
গুগলের মাধ্যমে একটি দ্রুত সমীক্ষা পরামর্শ দেয় যে ক্ষেত্রের অ্যাক্সেস সংখ্যাগরিষ্ঠ (যেমন, http://java.dzone.com/tips/12-feb-jpa-20-w--cesstype )।
আমি বিশ্বাস করি যে ফিল্ড অ্যাক্সেস হ'ল স্প্রিংয়ের দ্বারা প্রস্তাবিত প্রতিমা, তবে আমি এটির পিছনে কোনও রেফারেন্স পাই না।
একটি সম্পর্কিত এসও প্রশ্ন রয়েছে যা কার্য সম্পাদন পরিমাপ করার চেষ্টা করেছিল এবং এই সিদ্ধান্তে পৌঁছেছিল যে "কোনও পার্থক্য নেই"।
এখানে এমন একটি পরিস্থিতি রয়েছে যেখানে আপনি সম্পত্তি অ্যাক্সেসর ব্যবহার করতে পারেন। কল্পনা করুন যে আপনার 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
}
এখন ঠিক কীভাবে আপনার এই ক্লাসটি বর্ননা করা উচিত? উত্তরটি হ'ল আপনি এটিকে ক্ষেত্র বা সম্পত্তি অ্যাক্সেসের মাধ্যমে মোটেই টিকিয়ে রাখতে পারবেন না কারণ আপনি এই মুহুর্তে লক্ষ্য সত্তা নির্দিষ্ট করতে পারবেন না। আপনার কাছে কংক্রিটের বাস্তবায়নগুলি বর্নিত করতে হবে। তবে যেহেতু অবিচ্ছিন্ন বৈশিষ্ট্যগুলি এই সুপারক্লাসে ঘোষণা করা হয়েছে, তাই আপনাকে অবশ্যই সাবক্লাসে সম্পত্তি অ্যাক্সেস ব্যবহার করা উচিত।
অ্যাবস্ট্রাক্ট জেনেরিক সুপার-ক্লাস সহ কোনও অ্যাপ্লিকেশনে ফিল্ড অ্যাক্সেস কোনও বিকল্প নয়।
abstract T getOneThing()
, এবং abstract void setOneThing(T thing)
, এবং ক্ষেত্র অ্যাক্সেস ব্যবহার করতে পারেন ।
আমি সম্পত্তি অ্যাক্সেসর পছন্দ করতে এবং ব্যবহার করতে ঝোঁক:
foo.getId()
প্রক্সি শুরু না করে কল করার অনুমতি দেয় (হাইবারনেট ব্যবহারের সময় গুরুত্বপূর্ণ, এইচএইচএইচ -৩18১ resolved সমাধান না হওয়া পর্যন্ত )।অপূর্ণতা:
@Transient
চারপাশে রয়েছে কিনা তা দেখতে একটি সম্পূর্ণ ক্লাস ব্রাউজ করতে হবে।এটি সত্যিই একটি নির্দিষ্ট কেসের উপর নির্ভর করে - উভয় বিকল্প কোনও কারণে উপলব্ধ। আইএমও এটি তিনটি ক্ষেত্রে ফোটায়:
যদি আপনি সেটারগুলিতে সুনির্দিষ্টভাবে মান নির্ধারণ না করে (যেমন এনক্রিপশন বা গণনা) এর চেয়ে আরও কিছু করতে চান তবে আমি ক্ষেত্রের অ্যাক্সেস এবং প্রেরকদের (সম্পত্তি অ্যাক্সেস) এ টীকা দেওয়ার জন্য দৃ recommend়ভাবে সুপারিশ করব।
সম্পত্তি অ্যাক্সেসের সমস্যাটি হ'ল যখন বস্তুটি লোড হয় তখন সেটটারগুলিকেও ডাকা হয়। আমরা এনক্রিপশন প্রবর্তন না করা পর্যন্ত এটি আমার জন্য অনেক মাস ধরে কাজ করেছে। আমাদের ব্যবহারের ক্ষেত্রে আমরা সেটারে একটি ক্ষেত্র এনক্রিপ্ট করতে এবং গেটরে ডিক্রিপ্ট করতে চেয়েছিলাম। সম্পত্তি অ্যাক্সেসে এখন সমস্যা হ'ল হাইবারনেট যখন বস্তুটি লোড করেছিল তখন সেটারটিকে ক্ষেত্রটি পপুলেট করার জন্যও ডেকেছিল এবং এভাবে এনক্রিপ্ট করা মানটি আবার এনক্রিপ্ট করা হত। এই পোস্টে এটিরও উল্লেখ রয়েছে: জাভা হাইবারনেট: কে বলছে তার উপর নির্ভর করে বিভিন্ন সম্পত্তি সেট ফাংশন আচরণ
ফিল্ড অ্যাক্সেস এবং সম্পত্তি অ্যাক্সেসের মধ্যে পার্থক্যটি স্মরণ না করা পর্যন্ত এটি আমার মাথা ব্যাথার কারণ হয়ে দাঁড়িয়েছে। এখন আমি সম্পত্তি থেকে অ্যাক্সেস থেকে ক্ষেত্রের অ্যাক্সেসে আমার সমস্ত টীকাগুলি সরিয়ে নিয়েছি এবং এটি এখন দুর্দান্ত কাজ করে।
আমি নিম্নলিখিত কারণে ফিল্ড অ্যাক্সেস ব্যবহার পছন্দ করি:
সম্পত্তি এক্সেস যখন সমান / হ্যাশকোড বাস্তবায়ন ও খুব কদর্য বাগ হতে পারে সরাসরি ক্ষেত্র উল্লেখ (যেমন তাদের getters মাধ্যমে বিরোধিতা)। এর কারণ হ'ল গ্রাহকগণ অ্যাক্সেস করা হয় তখনই প্রক্সিটি আরম্ভ করা হয় এবং সরাসরি ক্ষেত্রের অ্যাক্সেসটি শূন্য হয়ে যায়।
সম্পত্তি এক্সেস সব টীকা করতে হবে ইউটিলিটি পদ্ধতি (যেমন addChild / removeChild) হিসেবে @Transient
।
ক্ষেত্রের অ্যাক্সেসের সাথে আমরা কোনও গেটরকে একেবারেই প্রকাশ না করে @ সংস্করণ ক্ষেত্রটি আড়াল করতে পারি। একজন গেটরও সেটার যুক্ত করতে পারে এবং version
ক্ষেত্রটি কখনই ম্যানুয়ালি সেট করা উচিত নয় (যা খুব বাজে সমস্যার দিকে নিয়ে যেতে পারে)। সমস্ত সংস্করণ বৃদ্ধিকরণটি OPTIMISTIC_FORCE_INCREMENT বা PESSIMISTIC_FORCE_INCREMENT স্পষ্ট লকিংয়ের মাধ্যমে ট্রিগার করা উচিত ।
version
ক্ষেত্র যা DTOs বিচ্ছিন্ন সত্ত্বা পরিবর্তে ব্যবহার করা হয় পরিস্থিতিতে প্রায়ই দরকারী।
আমি মনে করি সম্পত্তিটি বর্ণনা করা আরও ভাল কারণ ক্ষেত্রগুলি আপডেট করা সরাসরি এনক্যাপসুলেশনটি ভেঙে দেয়, এমনকি আপনার ORM এটি করার পরেও।
এটি যেখানে আপনাকে পুড়িয়ে ফেলবে তার একটি দুর্দান্ত উদাহরণ এখানে: আপনি সম্ভবত একই স্থানে হাইবারনেট যাচাইকারী এবং অধ্যবসায়ের জন্য আপনার টীকাগুলি চান (ক্ষেত্র বা সম্পত্তি) either যদি আপনি আপনার হাইবারনেট ভ্যালিডেটর চালিত বৈধতা যা ক্ষেত্রটিতে টীকায়িত হয় তা পরীক্ষা করতে চান, আপনি নিজের ইউনিট পরীক্ষাটি কেবল বৈধকারীর কাছে বিচ্ছিন্ন করতে আপনার সত্তার একটি মক ব্যবহার করতে পারবেন না। সেকি।
আমি বিশ্বাস করি সম্পত্তি অ্যাক্সেস বনাম ক্ষেত্রের অ্যাক্সেস অলস প্রারম্ভিকরণের ক্ষেত্রে মোটামুটি আলাদা।
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()
না।
ফিল্ড-ভিত্তিক অ্যাক্সেস চয়ন করার জন্য সবচেয়ে গুরুত্বপূর্ণ কারণগুলি সংক্ষিপ্ত করার চেষ্টা করি Let আপনি যদি আরও গভীরভাবে ডুব দিতে চান তবে দয়া করে আমার ব্লগে এই নিবন্ধটি পড়ুন: জেপিএ এবং হাইবারনেটে অ্যাক্সেস কৌশলগুলি - কোনটি ভাল, ক্ষেত্র বা সম্পত্তির অ্যাক্সেস?
ক্ষেত্র-ভিত্তিক অ্যাক্সেস এখন পর্যন্ত আরও ভাল বিকল্প। এটির জন্য এখানে 5 টি কারণ রয়েছে:
কারণ 1: আপনার কোডের আরও ভাল পঠনযোগ্যতা
আপনি যদি ক্ষেত্র-ভিত্তিক অ্যাক্সেস ব্যবহার করেন, আপনি আপনার ম্যাপিং টীকা সহ আপনার সত্তার বৈশিষ্ট্যগুলি টিকিয়ে দিন। আপনার শ্রেণীর শীর্ষে সমস্ত সত্তা বৈশিষ্ট্যের সংজ্ঞা স্থাপন করে আপনি সমস্ত বৈশিষ্ট্য এবং তাদের ম্যাপিংয়ের তুলনামূলকভাবে কমপ্যাক্ট ভিউ পাবেন।
কারণ 2: ওমিট গিটার বা সেটার পদ্ধতিগুলি যা আপনার অ্যাপ্লিকেশন দ্বারা কল করা উচিত নয়
ক্ষেত্র-ভিত্তিক অ্যাক্সেসের আরেকটি সুবিধা হ'ল আপনার অধ্যবসায় সরবরাহকারী, যেমন, হাইবারনেট বা এক্লিপস লিংক, আপনার সত্তার বৈশিষ্ট্যের গেটর এবং সেটার পদ্ধতি ব্যবহার করে না। এর অর্থ হ'ল আপনাকে এমন কোনও পদ্ধতি সরবরাহ করার দরকার নেই যা আপনার ব্যবসায়ের কোড ব্যবহার করা উচিত নয়। উত্পন্ন প্রাথমিক কী বৈশিষ্ট্য বা সংস্করণ কলামগুলির সেটার পদ্ধতির ক্ষেত্রে এটি প্রায়শই হয় । আপনার অধ্যবসায় সরবরাহকারী এই বৈশিষ্ট্যের মানগুলি পরিচালনা করে এবং আপনার সেগুলি প্রোগ্রামিকভাবে সেট করা উচিত নয়।
কারণ 3: গিটার এবং সেটার পদ্ধতিগুলির নমনীয় বাস্তবায়ন
যেহেতু আপনার অধ্যবসায় সরবরাহকারী গেটর এবং সেটার পদ্ধতিগুলিকে কল করে না, তারা কোনও বাহ্যিক প্রয়োজনীয়তা পূরণ করতে বাধ্য হয় না। আপনি যে কোনও পদ্ধতিতে এই পদ্ধতিগুলি প্রয়োগ করতে পারেন। এটি আপনাকে ব্যবসায়-নির্দিষ্ট বৈধকরণের নিয়মগুলি প্রয়োগ করতে, অতিরিক্ত ব্যবসায়িক যুক্তি যুক্ত করতে বা সত্তার বৈশিষ্ট্যটিকে একটি অন্য ডেটা ধরণের রূপান্তর করতে সক্ষম করে।
উদাহরণস্বরূপ, আপনি এটি একটি alচ্ছিক সমিতি মোড়ানোর জন্য বা জাভাতে অ্যাট্রিবিউট ব্যবহার করতে পারেন ।Optional
কারণ 4: ইউটিলিটি পদ্ধতি হিসাবে চিহ্নিত করার প্রয়োজন নেই @Transient
ক্ষেত্র-ভিত্তিক অ্যাক্সেস কৌশলটির আরেকটি সুবিধা হ'ল আপনাকে আপনার ইউটিলিটি পদ্ধতিগুলির সাথে বেনিফিট করতে হবে না @Transient
। এই টীকাটি আপনার অধ্যবসায় সরবরাহকারীকে বলে যে কোনও পদ্ধতি বা বৈশিষ্ট্য সত্তা স্থির অবস্থার অংশ নয়। এবং ক্ষেত্রের ধরণের অ্যাক্সেসের সাথে অবিচ্ছিন্ন অবস্থাটি আপনার সত্তার বৈশিষ্ট্যগুলি দ্বারা সংজ্ঞায়িত হয়ে যায়, আপনার জেপিএ বাস্তবায়ন আপনার সত্তার সমস্ত পদ্ধতি উপেক্ষা করে।
কারণ 5: প্রক্সিগুলির সাথে কাজ করার সময় বাগগুলি এড়িয়ে চলুন
হাইবারনেট অলসভাবে অ্যাসোসিয়েশনগুলিতে আনার জন্য প্রক্সি ব্যবহার করে যাতে এটি এই সমিতিগুলির সূচনা নিয়ন্ত্রণ করতে পারে। এই পদ্ধতির প্রায় সব পরিস্থিতিতেই কাজ করে। আপনি যদি সম্পত্তি-ভিত্তিক অ্যাক্সেস ব্যবহার করেন তবে এটি একটি বিপজ্জনক ক্ষতি হতে পারে।
আপনি যদি সম্পত্তি-ভিত্তিক অ্যাক্সেস ব্যবহার করেন, হাইবারনেট যখন আপনি গিটার পদ্ধতিটি কল করেন তখন প্রক্সি অবজেক্টের বৈশিষ্ট্যগুলিকে আরম্ভ করে। আপনি যদি আপনার ব্যবসায়িক কোডে প্রক্সি অবজেক্টটি ব্যবহার করেন তবে তা সর্বদা ক্ষেত্রে। তবে যথেষ্ট পরিমাণে সমান এবং হ্যাশকোড প্রয়োগগুলি সরাসরি বৈশিষ্ট্যগুলিতে অ্যাক্সেস করে। যদি আপনি প্রথমবারের মতো কোনও প্রক্সি বৈশিষ্ট্য অ্যাক্সেস করেন তবে এই বৈশিষ্ট্যগুলি এখনও অস্বীকার করা যায়।
ডিফল্টরূপে, জেপিএ সরবরাহকারী সত্তা ক্ষেত্রের মানগুলিতে অ্যাক্সেস করে এবং সত্তার জাভা বিয়ান প্রপার্টি অ্যাক্সেসার (গেটর) এবং মিউটেটর (সেটার) পদ্ধতি ব্যবহার করে সেই ক্ষেত্রগুলিকে ডাটাবেস কলামগুলিতে ম্যাপ করে। এই হিসাবে, কোনও সত্তায় ব্যক্তিগত ক্ষেত্রের নাম এবং প্রকারগুলি জেপিএর সাথে কোনও গুরুত্ব দেয় না। পরিবর্তে, জেপিএ জাভাবিয়ান সম্পত্তি অ্যাক্সেসরগুলির কেবল নাম এবং ফেরতের প্রকারগুলি দেখায়। আপনি @javax.persistence.Access
টীকাটি ব্যবহার করে এটি পরিবর্তন করতে পারেন , যা আপনাকে স্পষ্টভাবে JPA সরবরাহকারী নিয়োগ করা উচিত এমন অ্যাক্সেস পদ্ধতিটি নির্দিষ্ট করতে সক্ষম করে।
@Entity
@Access(AccessType.FIELD)
public class SomeEntity implements Serializable
{
...
}
অ্যাক্সেসটাইপ এনামের জন্য উপলভ্য বিকল্পগুলি হ'ল প্রোপার্টি (ডিফল্ট) এবং ফিল্ড। PROPERTY এর সাথে, সরবরাহকারী জাভাবিয়ান সম্পত্তি পদ্ধতিগুলি ব্যবহার করে ক্ষেত্রের মানগুলি নির্ধারণ করে এবং সেট করে। FIELD সরবরাহকারীগুলিকে উদাহরণ ক্ষেত্রগুলি ব্যবহার করে ক্ষেত্রের মানগুলি সেট এবং সেট করে তোলে। সেরা অনুশীলন হিসাবে, আপনার কেবলমাত্র ডিফল্টটিকে আটকে থাকা এবং জাভাবিয়ান বৈশিষ্ট্যগুলি ব্যবহার করা উচিত যদি না আপনার অন্যথায় করার বাধ্যতামূলক কারণ না থাকে।
আপনি ব্যক্তিগত ক্ষেত্র বা পাবলিক অ্যাকসেসর পদ্ধতিতে এই সম্পত্তি টীকাগুলি রাখতে পারেন। আপনি যদি AccessType.PROPERTY
জাভাবিয়ান অ্যাকসেসরের পরিবর্তে ব্যক্তিগত ক্ষেত্রগুলি (ডিফল্ট) ব্যবহার করে এবং টীকায়িত করেন তবে ক্ষেত্রের নামগুলি অবশ্যই জাভাবিয়ান সম্পত্তি নামের সাথে মেলে। তবে আপনি জাভাবিয়ান অ্যাক্সেসরগুলি টিকিয়ে রাখলে নামগুলি মেলাতে হবে না। তেমনিভাবে, আপনি যদি AccessType.FIELD
ক্ষেত্রগুলির পরিবর্তে জাভাবিয়ান অ্যাক্সেসরগুলি ব্যবহার করেন এবং এনারোটেট করেন তবে ফিল্ডের নামগুলি অবশ্যই জাভাবিয়ান সম্পত্তি নামের সাথে মিলে যাবে। এই ক্ষেত্রে, আপনি যদি ক্ষেত্রগুলি টিকিয়ে রাখেন তবে তাদের মিলতে হবে না। জাভাবিয়ান অ্যাক্সেসরগুলির জন্য AccessType.PROPERTY
এবং এর জন্য ক্ষেত্রগুলিকে কেবল সামঞ্জস্যপূর্ণ এবং টীকায়িত করা ভাল
AccessType.FIELD
।
এটি গুরুত্বপূর্ণ যে আপনার কখনই একই সত্তায় জেপিএ সম্পত্তি টীকা এবং জেপিএ ফিল্ড টীকাগুলি মিশ্রিত করা উচিত নয়। এটি করা অনির্ধারিত আচরণে ফলাফল দেয় এবং ত্রুটি হওয়ার সম্ভাবনা থাকে।
এটি একটি পুরানো উপস্থাপনা তবে রড পরামর্শ দেয় যে সম্পত্তি অ্যাক্সেসে টিকাটি অ্যানিমিক ডোমেন মডেলগুলিকে উত্সাহ দেয় এবং এটিকে বেনিফিট করার "ডিফল্ট" উপায় হওয়া উচিত নয়।
ক্ষেত্রের অ্যাক্সেসের পক্ষে অন্য একটি বিষয় হ'ল অন্যথায় আপনি সংগ্রহের জন্য সেটটারগুলি প্রকাশ করতে বাধ্য হলেন এবং আমার পক্ষে হাইবারনেট দ্বারা পরিচালিত কোনও বস্তুতে অবিচ্ছিন্ন সংগ্রহের উদাহরণটি পরিবর্তন করা আপনার ডেটা ধারাবাহিকতা অবশ্যই ভেঙে দেবে বলে একটি খারাপ ধারণা।
সুতরাং আমি সুরক্ষিত ক্ষেত্রগুলি হিসাবে ডিফল্ট কনস্ট্রাক্টরের খালি বাস্তবায়ন শুরু করে এবং কেবলমাত্র তাদের প্রাপ্তকারীদেরই প্রকাশ করতে পছন্দ করি হিসাবে সংগ্রহগুলি পছন্দ করি। মত তারপর, শুধুমাত্র পরিচালিত অপারেশন clear()
, remove()
, removeAll()
ইত্যাদি সম্ভবত হাইবারনেট পরিবর্তনের অবিদিত করতে হবে না হয়।
আমি ক্ষেত্রগুলিকে পছন্দ করি তবে আমি এমন একটি পরিস্থিতির মধ্যে চলে এসেছি যা দেখে মনে হয় যে আমাকে গ্রাহকদের উপরে টীকাগুলি রাখতে বাধ্য করা হবে।
হাইবারনেট জেপিএ প্রয়োগের সাথে, @Embedded
ক্ষেত্রগুলিতে কাজ করছে বলে মনে হয় না। সুতরাং যে যেতে হবে। এবং একবার আপনি এটি গিটারের উপরে রাখেন, তারপরে বিভিন্ন @Column
টীকাগুলি গেটসগুলিতেও যেতে হবে। (আমার মনে হয় হাইবারনেট এখানে মেশানো ক্ষেত্র এবং গেটারদের চায় না)) এবং একবার আপনি @Column
একটি ক্লাসে গেটার্স লাগিয়ে দিলে, সম্ভবত এটি পুরোপুরি করার পক্ষে তা বোধগম্য হয়।
আমি ফিল্ড অ্যাক্সেসরদের পক্ষে। কোডটি অনেক ক্লিনার। সমস্ত টীকাগুলি একটি শ্রেণীর একটি বিভাগে স্থাপন করা যেতে পারে এবং কোডটি পড়া খুব সহজ।
সম্পত্তি অ্যাক্সেসরগুলির সাথে আমি আরও একটি সমস্যা পেয়েছি: যদি আপনার ক্লাসে এক্সওয়াইজেড পদ্ধতিগুলি থাকে যা ধ্রুবক সম্পত্তিগুলির সাথে যুক্ত বলে উল্লেখ করা হয় না, হাইবারনেট সেই সম্পত্তিগুলি অর্জনের জন্য স্কুয়েল উত্পন্ন করে, যার ফলে কিছু খুব বিভ্রান্তিকর ত্রুটি বার্তা আসে। দুই ঘন্টা নষ্ট। আমি এই কোডটি লিখিনি; আমি অতীতে সর্বদা ফিল্ড অ্যাক্সেসর ব্যবহার করেছি এবং এই সমস্যাটিতে কখনই প্রবেশ করিনি।
এই অ্যাপ্লিকেশনটিতে হাইবারনেট সংস্করণ ব্যবহৃত হয়েছে:
<!-- 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>
বৈশিষ্ট্যগুলির মাধ্যমে অ্যাক্সেসের চেয়ে আপনার ক্ষেত্রগুলির মাধ্যমে অ্যাক্সেস চয়ন করা উচিত। ক্ষেত্রগুলির সাহায্যে আপনি প্রেরিত এবং প্রাপ্ত ডেটা সীমাবদ্ধ করতে পারেন। বৈশিষ্ট্যগুলির মাধ্যমে আপনি হোস্ট হিসাবে আরও ডেটা প্রেরণ করতে পারেন এবং জি ডিনোমিনেশনস নির্ধারণ করতে পারেন (যা মোটামুটি বৈশিষ্ট্যগুলির বেশিরভাগ সেট করে)।
হাইবারনেটে অ্যাক্সেসটাইপ সম্পর্কিত আমার একই প্রশ্ন ছিল এবং এখানে কিছু উত্তর পাওয়া গেল ।
আমি অলস সূচনা এবং ক্ষেত্রের অ্যাক্সেসটি এখানে সমাধান করেছি একের একটিকে হাইবারনেট করুন: পুরো অবজেক্টটি আনয়ন ছাড়াই getId () করুন
আমরা সত্তা মটরশুটি তৈরি করেছি এবং গেটর এনোটেশন ব্যবহার করেছি। আমরা যে সমস্যার মধ্যে পড়েছিলাম তা হ'ল: কিছু সত্তাগুলি কখন আপডেট হতে পারে সে সম্পর্কে কিছু সম্পত্তি সম্পর্কিত জটিল নিয়ম রয়েছে। সমাধানটি ছিল প্রতিটি সেটারে কিছু ব্যবসায়িক যুক্তি যা কিনা নির্ধারণ করে যে আসল মানটি পরিবর্তন হয়েছে কিনা এবং যদি তাই হয় তবে পরিবর্তনের অনুমতি দেওয়া উচিত কিনা। অবশ্যই, হাইবারনেট সর্বদা বৈশিষ্ট্যগুলি সেট করতে পারে তাই আমরা দুটি গ্রুপ সেটারের সাথে শেষ করেছি। সুন্দর অসুন্দর.
পূর্ববর্তী পোস্টগুলি পড়া, আমি আরও দেখতে পেলাম যে সত্তার অভ্যন্তর থেকে বৈশিষ্ট্যগুলি উল্লেখ করার ফলে সংগ্রহগুলি লোড না হওয়ায় সমস্যা হতে পারে।
নীচের লাইন, আমি ভবিষ্যতে ক্ষেত্রগুলি টীকা দেওয়ার দিকে ঝুঁকবো।
সাধারণত মটরশুটিগুলি POJO হয়, সুতরাং তাদের যাইহোক অ্যাক্সেসর রয়েছে।
সুতরাং প্রশ্নটি "কোনটি আরও ভাল?" নয়, তবে কেবল "কখন ক্ষেত্রের অ্যাক্সেস ব্যবহার করবেন?"। এবং উত্তরটি হল "যখন আপনাকে ক্ষেত্রের জন্য সেটার / গেটারের প্রয়োজন হবে না!"।
আমি এটি সম্পর্কে চিন্তাভাবনা করছি এবং আমি পদ্ধতি অ্যাকসেসর চয়ন করি
কেন?
কারণ ক্ষেত্র এবং মেথোস অ্যাকসেসর সমান তবে পরে যদি আমার লোড ক্ষেত্রে কিছু যুক্তি প্রয়োজন তবে আমি ক্ষেত্রগুলিতে রাখা সমস্ত টিকা সংরক্ষণ করি
শুভেচ্ছা
Grubhart
উভয়:
EJB3 স্পেসের প্রয়োজন হয় যে আপনি যে উপাদানটি অ্যাক্সেস করতে পারবেন তার প্রকারে টীকাগুলি ঘোষণা করুন, অর্থাত্ যদি আপনি সম্পত্তির অ্যাক্সেস ব্যবহার করেন, তবে ক্ষেত্রের অ্যাক্সেস ব্যবহার করেন field
https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping
অ্যাক্সেসটাইপ.প্রযুক্তি: ইজেবি অধ্যবসায় বাস্তবায়ন জাভাবিয়ান "সেটার" পদ্ধতিগুলির মাধ্যমে আপনার শ্রেণিতে স্টেট লোড করবে এবং জাভাবিয়ান "গেটর" পদ্ধতিগুলি ব্যবহার করে আপনার শ্রেণি থেকে রাষ্ট্র পুনরুদ্ধার করবে। এটি ডিফল্ট।
অ্যাক্সেসটাইপ.ফিল্ড: রাজ্যটি আপনার শ্রেণীর ক্ষেত্রগুলি থেকে সরাসরি লোড এবং পুনরুদ্ধার করা হয়। আপনাকে জাভাবিয়ান "গেটরস" এবং "সেটার" লিখতে হবে না।