টি এল; ডিআর
T findOne(ID id)
(পুরানো এপিআই- Optional<T> findById(ID id)
তে নাম ) / (নতুন এপিআই-তে নাম) এতে EntityManager.find()
কোনও সত্তা আগ্রহী লোডিং সম্পাদন করে ।
T getOne(ID id)
এর উপর নির্ভর EntityManager.getReference()
করে একটি সত্তা অলস লোডিং সম্পাদন করে । সুতরাং সত্তার কার্যকর লোডিং নিশ্চিত করার জন্য, এটিতে কোনও পদ্ধতির আবেদন করা প্রয়োজন।
findOne()/findById()
তুলনায় সত্যিই আরও স্পষ্ট এবং সহজ getOne()
।
তাই মামলা খুব বেশিরভাগ, পক্ষপাতী findOne()/findById()
উপর getOne()
।
এপিআই পরিবর্তন
কমপক্ষে, 2.0
সংস্করণটি থেকে Spring-Data-Jpa
পরিবর্তিত findOne()
।
পূর্বে, এটি CrudRepository
ইন্টারফেসে এটি সংজ্ঞায়িত হয়েছিল :
T findOne(ID primaryKey);
এখন, findOne()
আপনি যে একক পদ্ধতিতে সন্ধান করতে পারবেন তা CrudRepository
হ'ল QueryByExampleExecutor
ইন্টারফেসে কোনটি সংজ্ঞায়িত হয়েছে :
<S extends T> Optional<S> findOne(Example<S> example);
এটি অবশেষে প্রয়োগ করা হয় SimpleJpaRepository
, CrudRepository
ইন্টারফেসের ডিফল্ট প্রয়োগ ।
এই পদ্ধতিটি উদাহরণ অনুসন্ধানের দ্বারা একটি ক্যোয়ারী এবং আপনি এটি প্রতিস্থাপন হিসাবে চান না।
আসলে, একই আচরণের পদ্ধতিটি নতুন এপিআইতে এখনও রয়েছে তবে পদ্ধতির নামটি পরিবর্তিত হয়েছে।
এটা তোলে থেকে নাম দেওয়া হয় findOne()
থেকে findById()
এ CrudRepository
ইন্টারফেস:
Optional<T> findById(ID id);
এখন এটি একটি ফেরত Optional
। যা রোধ করা এতটা খারাপ নয় NullPointerException
।
সুতরাং, আসল পছন্দটি এখন Optional<T> findById(ID id)
এবং এর মধ্যে T getOne(ID id)
।
দুটি স্বতন্ত্র পদ্ধতি যা দুটি স্বতন্ত্র জেপিএ সত্তাজনিত পুনরুদ্ধার পদ্ধতির উপর নির্ভর করে
1) Optional<T> findById(ID id)
জাভাডোক বলে যে এটি:
একটি আইডি দ্বারা একটি সত্তা পুনরুদ্ধার।
আমরা বাস্তবায়নের দিকে নজর দেওয়ার সাথে সাথে আমরা দেখতে পাচ্ছি যে এটি EntityManager.find()
পুনরুদ্ধার করতে নির্ভর করে :
public Optional<T> findById(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
Class<T> domainType = getDomainClass();
if (metadata == null) {
return Optional.ofNullable(em.find(domainType, id));
}
LockModeType type = metadata.getLockModeType();
Map<String, Object> hints = getQueryHints().withFetchGraphs(em).asMap();
return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
}
এবং এখানে em.find()
একটি EntityManager
পদ্ধতি হিসাবে ঘোষণা করা হয়েছে:
public <T> T find(Class<T> entityClass, Object primaryKey,
Map<String, Object> properties);
এর জাভাদোক বলেছেন:
নির্দিষ্ট বৈশিষ্ট্য ব্যবহার করে প্রাথমিক কী দ্বারা সন্ধান করুন
সুতরাং, বোঝা সত্তা পুনরুদ্ধার প্রত্যাশিত বলে মনে হচ্ছে।
২) T getOne(ID id)
জাভাদোকের বক্তব্য (জোর আমার)
প্রদত্ত শনাক্তকারী সহ সত্তার একটি রেফারেন্স প্রদান করে।
আসলে, রেফারেন্স পরিভাষাটি সত্যই বোর্ড এবং জেপিএ এপিআই কোনও getOne()
পদ্ধতি নির্দিষ্ট করে না ।
সুতরাং স্প্রিং র্যাপার কী করে তা বোঝার জন্য সর্বোত্তম কাজটি বাস্তবায়নের দিকে নজর দিচ্ছে:
@Override
public T getOne(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
return em.getReference(getDomainClass(), id);
}
এখানে em.getReference()
একটি EntityManager
পদ্ধতি হিসাবে ঘোষণা করা হয়েছে:
public <T> T getReference(Class<T> entityClass,
Object primaryKey);
এবং ভাগ্যক্রমে, EntityManager
জাভাদোকটি তার উদ্দেশ্যকে আরও ভালভাবে সংজ্ঞায়িত করেছে (জোর দেওয়া আমার):
একটি উদাহরণ পান, যার রাজ্যে আলস্যভাবে আনতে পারে । যদি অনুরোধ করা দৃষ্টান্তটি ডাটাবেসে উপস্থিত না থাকে, উদাহরণস্বরূপ রাষ্ট্রটি প্রথম অ্যাক্সেস করা হলে অ্যান্টিটি নটফাউন্ডএক্সসেপশন নিক্ষেপ করা হয় । (যখন জিগ্রিফারেন্স বলা হয় তখন অধ্যবসায়ী প্রদানকারী রানটাইমটি সত্ত্বা নটফাউন্ডএক্সসেপশন নিক্ষেপ করার অনুমতি দেয়)) অ্যাপ্লিকেশনটির প্রত্যাশা করা উচিত নয় যে সত্তা ব্যবস্থাপকটি উন্মুক্ত থাকাকালীন অ্যাপ্লিকেশন দ্বারা অ্যাক্সেস না করা হলে উদাহরণস্বরূপ রাজ্যটি বিচ্ছিন্নকরণের উপরে উপলব্ধ থাকবে ।
সুতরাং, অনুরোধ করা getOne()
একটি অলস আনীত সত্তা ফিরিয়ে দিতে পারে।
এখানে, অলস আনয়ন সত্তার সাথে সম্পর্কিত নয় বরং সত্তার সাথে সম্পর্কিত।
এর অর্থ হ'ল আমরা যদি প্রার্থনা করি getOne()
এবং তারপরে দৃistence়তা প্রসঙ্গটি বন্ধ হয়ে যায়, সত্তাটি কখনই লোড করা যায় না এবং ফলস্বরূপ ফলাফলটি অনির্দেশ্য।
উদাহরণস্বরূপ যদি প্রক্সি অবজেক্টটি সিরিয়ালযুক্ত হয়, আপনি null
সিরিয়ালাইজড ফলাফল হিসাবে একটি রেফারেন্স পেতে পারেন বা যদি কোনও পদ্ধতি প্রক্সি অবজেক্টে ডাকা হয় তবে একটি ব্যতিক্রম যেমন LazyInitializationException
নিক্ষেপ করা হয়।
সুতরাং এই ধরণের পরিস্থিতিতে, ডাটাবেসে উপস্থিত নেই এমন একটি দস্তাবেজ হ্যান্ডেল EntityNotFoundException
করতে ব্যবহার getOne()
করার মূল কারণ হ'ল সত্তা উপস্থিত না থাকলে ত্রুটি পরিস্থিতি কখনই সম্পাদন করা যায় না।
যে কোনও ক্ষেত্রে, এটির লোড নিশ্চিত করতে আপনাকে সেশনটি খোলা থাকাকালীন সত্তাকে ম্যানিপুলেট করতে হবে। সত্তার কোনও পদ্ধতিতে অনুরোধ করে আপনি এটি করতে পারেন।
বা এর findById(ID id)
পরিবর্তে আরও ভাল বিকল্প ব্যবহার ।
এত অস্পষ্ট এপিআই কেন?
শেষ করতে, স্প্রিং-ডেটা-জেপিএ বিকাশকারীদের জন্য দুটি প্রশ্ন:
কেন একটি পরিষ্কার ডকুমেন্টেশন নেই getOne()
? সত্তা অলস লোডিং আসলে কোনও বিশদ নয়।
কেন আপনার getOne()
মোড়কের সাথে পরিচয় করিয়ে দেওয়া দরকার EM.getReference()
?
কেন কেবল আবৃত পদ্ধতি বিদ্ধ না: getReference()
? খুব getOne()
সহজ প্রসেসিংয়ের সময় এই ইএম পদ্ধতিটি খুব নির্দিষ্ট ।