নো-আর্গুমেন্ট কনস্ট্রাক্টর একটি প্রয়োজনীয়তা (হাইবারনেটের মতো সরঞ্জামগুলি অবজেক্টগুলি ইনস্ট্যান্ট করতে এই কনস্ট্রাক্টরের প্রতিবিম্ব ব্যবহার করে)।
আমি এই হ্যান্ড-ওয়েভ উত্তরটি পেয়েছি তবে কেউ কি আরও কিছু বলতে পারে? ধন্যবাদ
নো-আর্গুমেন্ট কনস্ট্রাক্টর একটি প্রয়োজনীয়তা (হাইবারনেটের মতো সরঞ্জামগুলি অবজেক্টগুলি ইনস্ট্যান্ট করতে এই কনস্ট্রাক্টরের প্রতিবিম্ব ব্যবহার করে)।
আমি এই হ্যান্ড-ওয়েভ উত্তরটি পেয়েছি তবে কেউ কি আরও কিছু বলতে পারে? ধন্যবাদ
Caused by: org.hibernate.InstantiationException: No default constructor for entity: : hibernate.tutorial.Student
যেভাবে আমার মুখোমুখি হয়েছিল সে হিসাবে প্রতিবেদন করবে - বস্তুগুলি ইনস্ট্যান্টিয়েট করার জন্য হাইবারনেটের একটি ডিফল্ট নির্মাণকারীর প্রয়োজন হয়
উত্তর:
হাইবারনেট এবং সাধারণভাবে কোড যা প্রতিচ্ছবি ব্যবহারের মাধ্যমে অবজেক্ট Class<T>.newInstance()
তৈরি করে আপনার ক্লাসগুলির একটি নতুন উদাহরণ তৈরি করে। এই পদ্ধতিটির জন্য অবজেক্টটি ইনস্ট্যান্ট করতে সক্ষম হতে একটি সার্বজনীন নো-আরগ নির্মাণকারী প্রয়োজন। বেশিরভাগ ব্যবহারের ক্ষেত্রে, কোনও নো-আরগ কন্সট্রাক্টর সরবরাহ করা কোনও সমস্যা নয়।
সিরিয়ালাইজেশন ভিত্তিক হ্যাক রয়েছে যা নো-আরগ কনস্ট্রাক্টর না থাকার আশেপাশে কাজ করতে পারে, যেহেতু সিরিয়ালাইজেশন কনস্ট্রাক্টরকে ডাকে না করে অবজেক্ট তৈরি করতে jvm ম্যাজিক ব্যবহার করে। তবে এটি সমস্ত ভিএম জুড়ে উপলভ্য নয়। উদাহরণস্বরূপ, এক্সস্ট্রিম এমন অবজেক্টগুলির উদাহরণ তৈরি করতে পারে যার সার্বজনীন নো-আরগ নির্মাণকারী নেই, তবে কেবল তথাকথিত "বর্ধিত" মোডে চালিয়ে যা কেবলমাত্র নির্দিষ্ট ভিএমগুলিতে উপলব্ধ। (বিশদটির জন্য লিঙ্কটি দেখুন)) হাইবারনেটের ডিজাইনাররা অবশ্যই সমস্ত ভিএম এর সাথে সামঞ্জস্য বজায় রাখতে পছন্দ করেছেন এবং তাই এই জাতীয় কৌশলগুলি এড়িয়ে চলে এবং Class<T>.newInstance()
কোনও নো-আরগ নির্মাণকারী প্রয়োজনে সরকারীভাবে সমর্থিত প্রতিচ্ছবি পদ্ধতিটি ব্যবহার করে ।
setAccessible(true)
এটিতে প্যাকেজ দৃশ্যমানতা থাকতে পারে এবং এতে হাইবারনেট হওয়া উচিত ।
ObjectInputStream
কিছু করেsun.reflect.ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToGetInstanceOf, Object.class.getConstructor()).newInstance()
It can have package visibility and Hibernate should setAccessible(true)
। it
প্রতিফলনের মাধ্যমে শ্রেণিটি ইনস্ট্যান্টিয়েট করা মানে কি ? এবং Hibernate should setAccessible(true)
মানে কি?
হাইবারনেট আপনার বিষয়গুলি তাত্ক্ষণিক করে তোলে। সুতরাং এগুলি তাত্ক্ষণিকভাবে সক্ষম করার প্রয়োজন। যদি কোনও নো-আরগ কনস্ট্রাক্টর না থাকে তবে হাইবারনেট কীভাবে এটি ইনস্ট্যান্ট করতে হবে তা বুঝতে পারে না , মানে কোন যুক্তিটি পাস করতে হবে।
হাইবারনেট ডকুমেন্টেশন বলেছেন:
4.1.1। একটি নো-আর্গুমেন্ট নির্মাণকারী কার্যকর করুন lement
সমস্ত ধ্রুবক শ্রেণীর অবশ্যই একটি ডিফল্ট নির্মাতা থাকতে হবে (যা জনসাধারণের হতে পারে) যাতে হাইবারনেট এগুলি ব্যবহার করে তাত্ক্ষণিক করতে পারে Constructor.newInstance()
। হাইবারনেটে রানটাইম প্রক্সি জেনারেশনের জন্য কমপক্ষে প্যাকেজ ভিজিবিলিটি সহ আপনার একটি ডিফল্ট কনস্ট্রাক্টর প্রস্তাবিত।
ERM, দুঃখিত সবাই, কিন্তু হাইবারনেট করে না প্রয়োজন যে আপনার ক্লাস একটি parameterless কন্সট্রাকটর থাকতে হবে। JPA 2.0 স্পেসিফিকেশন এটি প্রয়োজন, এবং এই JPA পক্ষে খুব খোঁড়া হয়। জেএক্সবির মতো অন্যান্য ফ্রেমওয়ার্কগুলিতেও এটির প্রয়োজন হয়, যা সেই ফ্রেমওয়ার্কগুলির পক্ষে খুব লম্পট।
(প্রকৃতপক্ষে, জ্যাকএক্সবি সত্তা কারখানাগুলিকে অনুমতি দেয় তবে এটি এই কারখানাগুলিকে নিজেই ইনস্ট্যান্ট করার উপর জোর দেয়, তাদের কাছে একটি - গগস ওয়াট - প্যারামিটারলেস কনস্ট্রাক্টর থাকতে হবে , যা আমার বইয়ে কারখানাগুলিকে অনুমতি না দেওয়ার মতোই উত্তম; এটি কতটা লম্পট? !)
তবে হাইবারনেটের এমন কোনও প্রয়োজন হয় না।
হাইবারনেট একটি বাধা ব্যবস্থাকে সমর্থন করে, ( ডকুমেন্টেশনে "ইন্টারসেপ্টর" দেখুন ) যা আপনাকে যাবতীয় কনস্ট্রাক্টর প্যারামিটারের সাহায্যে আপনার অবজেক্টগুলি ইনস্ট্যান্ট করতে সহায়তা করে।
মূলত, আপনি যা করেন তা হ'ল আপনি যখন হাইবারনেট সেটআপ করেন তখন আপনি এটি org.hibernate.Interceptor
ইন্টারফেস প্রয়োগকারী কোনও বস্তুটি পাস করেন এবং হাইবারনেটটি instantiate()
যখনই আপনার ইন্টারফেসের কোনও নতুন উদাহরণের প্রয়োজন হয় তখন সেই ইন্টারফেসের পদ্ধতিটিকে অনুরোধ করবে , সুতরাং সেই পদ্ধতিটি আপনার বাস্তবায়ন করতে পারে new
আপনার পছন্দসই উপায়ে আপনার জিনিসগুলি।
আমি এটি একটি প্রকল্পে করেছি এবং এটি কবজির মতো কাজ করে। এই প্রকল্পে আমি যখনই সম্ভব জেপিএ এর মাধ্যমে জিনিসগুলি করি এবং আমার কেবল অন্য কোনও বিকল্প না থাকে তখন আমি কেবল ইন্টারসেপ্টারের মতো হাইবারনেট বৈশিষ্ট্যগুলি ব্যবহার করি।
হাইবারনেট এটিকে কিছুটা নিরাপদ বলে মনে হচ্ছে, যেমন শুরুর সময় এটি আমার প্রতিটি সত্তা ক্লাসের জন্য একটি তথ্য বার্তা জারি করে, আমাকে বলে INFO: HHH000182: No default (no-argument) constructor for class
এবং class must be instantiated by Interceptor
তারপর, পরে পরে আমি সেগুলি ইন্টারসেপ্টারের মাধ্যমে ইনস্ট্যান্ট করি এবং এতে খুশি হয় do
হাইবারনেট ব্যতীত অন্য সরঞ্জামগুলির জন্য প্রশ্নের "কেন" অংশটির উত্তর দেওয়ার জন্য উত্তরটি "একেবারেই কোনও ভাল কারণেই নয়", এবং এটি হাইবারনেট ইন্টারসেপ্টারের অস্তিত্বের দ্বারা প্রমাণিত। অনেকগুলি সরঞ্জাম রয়েছে যা ক্লায়েন্ট অবজেক্ট ইনস্ট্যান্টিয়েশনের জন্য কিছু অনুরূপ প্রক্রিয়া সমর্থন করতে পারে, কিন্তু তারা তা করে না, সুতরাং তারা নিজেরাই বস্তুগুলি তৈরি করে, তাই তাদের প্যারামিটারলেস কনস্ট্রাক্টরের প্রয়োজন হয়। আমি বিশ্বাস করতে প্ররোচিত হয়েছি কারণ এই সরঞ্জামগুলির নির্মাতারা নিজেকে নিনজা সিস্টেম প্রোগ্রামার হিসাবে ভাবেন যিনি যাদুতে পূর্ণ ফ্রেমওয়ার্ক তৈরি করেন যা অজ্ঞ অ্যাপ্লিকেশন প্রোগ্রামাররা ব্যবহার করতে পারেন, যারা (তাই তারা মনে করেন) তাদের বুনো স্বপ্নগুলিতে কখনও কখনও একটি থাকে না কারখানার প্যাটার্ন ... এর মতো উন্নত নির্মাণের প্রয়োজন । (ঠিক আছে,তাই ভাবা। আমি আসলে তা মনে করি না। আমি মজা করছি.)
Caused by: org.hibernate.InstantiationException: No default constructor for entity: : hibernate.tutorial.Student
যা সম্প্রতি ঘটেছিল কারণ javax.persistence.*;
এটি org.hibernate
তৈরি হয়েছিল এবং কেবল তৈরি করার সময়Session, SessionFactory, and Configuration
হাইবারনেট একটি ওআরএম কাঠামো যা ক্ষেত্র বা সম্পত্তি অ্যাক্সেস কৌশল সমর্থন করে। তবে এটি কনস্ট্রাক্টর-ভিত্তিক ম্যাপিং সমর্থন করে না - সম্ভবত আপনি কী চান? - কারণ কিছু সমস্যা
1- আপনার ক্লাসে প্রচুর কনস্ট্রাক্টর রয়েছে কিনা তা ঘটে
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) { ... }
public Person(String name) { ... }
public Person(Integer age) { ... }
}
আপনি দেখতে পাচ্ছেন যে, আপনি অসঙ্গতি নিয়ে একটি সমস্যা মোকাবেলা করেছেন কারণ হাইবারনেট কোনও নির্মাণকারীকে ডাকা উচিত বলে ধরে নিতে পারে না। উদাহরণস্বরূপ, ধরুন আপনার কোনও সঞ্চিত ব্যক্তি অবজেক্টটি পুনরুদ্ধার করতে হবে
Person person = (Person) session.get(Person.class, <IDENTIFIER>);
কোন ব্যক্তির অবজেক্টটি পুনরুদ্ধার করতে হাইবারনেট কল করা উচিত কোন নির্মাণকারীর? তুমি কি দেখতে পারো ?
2º এবং পরিশেষে, প্রতিবিম্বটি ব্যবহার করে হাইবারনেট কোনও নো-আরগ কনস্ট্রাক্টরের মাধ্যমে কোনও শ্রেণি ইনস্ট্যান্ট করতে পারে। সুতরাং আপনি কল যখন
Person person = (Person) session.get(Person.class, <IDENTIFIER>);
হাইবারনেট নীচে আপনার ব্যক্তি বস্তু ইনস্ট্যান্ট করবে
Person.class.newInstance();
যা এপিআই ডকুমেন্টেশন অনুসারে
ক্লাসটি তাত্ক্ষণিকভাবে শূন্য যুক্তি তালিকার একটি নতুন এক্সপ্রেশন দ্বারা
গল্পের নৈতিক
Person.class.newInstance();
অনুরূপ
new Person();
আর কিছু না
name
এবং age
? তা না হলে এটি পরে অন্য কনস্ট্রাক্টর ব্যবহার করে?
প্রকৃতপক্ষে, আপনি ক্লাস ইনস্ট্যান্ট করতে পারেন যার কোনও 0-আরগস নির্মাণকারী নেই; আপনি একটি শ্রেণীর নির্মাতাদের একটি তালিকা পেতে পারেন, একটি বাছাই করতে এবং বগাস পরামিতিগুলির সাথে এটি আবেদন করতে পারেন।
যদিও এটি সম্ভব, এবং আমি অনুমান করি এটি কার্যকর হবে এবং সমস্যাযুক্ত হবে না, আপনাকে সম্মতি জানাতে হবে যে এটি বেশ অদ্ভুত।
হাইবারনেট যেভাবে বস্তুগুলি তৈরি করে (আমি বিশ্বাস করি এটি 0-আরগ কনস্ট্রাক্টরকে আহ্বান করে এবং তারপরে এটি সম্ভবত প্রতিবিম্বের মাধ্যমে উদাহরণের ক্ষেত্রগুলিকে সরাসরি পরিবর্তন করে Perhaps সম্ভবত এটি সেটারগুলি কল করতে জানে) কীভাবে কোনও অবজেক্টটি নির্মাণ করা হবে তার বিপরীতে কিছুটা যায় against জাভা- উপযুক্ত পরামিতিগুলির সাথে কনস্ট্রাক্টরকে অনুরোধ করুন যাতে নতুন অবজেক্টটি আপনার পছন্দসই বস্তু। আমি বিশ্বাস করি যে কোনও বস্তুকে তাত্ক্ষণিকভাবে তা পরিবর্তন করা কিছুটা "অ্যান্টি-জাভা" (বা আমি বলব, বিরোধী খাঁটি তাত্ত্বিক জাভা) - এবং অবশ্যই আপনি যদি সরাসরি ক্ষেত্রের হেরফেরের মাধ্যমে এটি করেন তবে এটি এনক্যাপসুলেশন হয় এবং সমস্ত অভিনব এনক্যাপসুলেশন স্টাফ থাকে believe ।
আমি মনে করি যে এটি করার যথাযথ উপায় হিবারনেট ম্যাপিংয়ে এটি নির্ধারণ করা হবে যে কীভাবে কোনও বস্তু যথাযথ কন্সট্রাক্টর ব্যবহার করে ডাটাবেস সারিতে তথ্য থেকে ইনস্ট্যান্ট করা উচিত ... তবে এটি আরও জটিল হবে - যার অর্থ হাইবারনেট উভয়ই সমান হবে আরও জটিল, ম্যাপিংটি আরও জটিল হবে ... এবং সবগুলি আরও "বিশুদ্ধ" হতে হবে; এবং আমি মনে করি না বর্তমান পদ্ধতির (এটি "সঠিক উপায়ে" জিনিসগুলি করার বিষয়ে ভাল বোধ করা ছাড়া) এর কোনও সুবিধা হবে।
এটি বলে এবং হাইবারনেট পদ্ধতিটি খুব "পরিষ্কার" নয় বলে দেখে 0-আরগ নির্মাতা থাকার বাধ্যবাধকতা কঠোরভাবে প্রয়োজন হয় না, তবে আমি কিছুটা প্রয়োজনীয়তা বুঝতে পারি, যদিও আমি বিশ্বাস করি তারা এটি নিখুঁতভাবে "সঠিক পথে করেছেন" "ভিত্তি, যখন তারা এর অনেক আগে" যথাযথ উপায় "(যুক্তিসঙ্গত কারণে যাই হোক না কেন) থেকে বিপথগামী হয়েছিল।
হাইবারনেটকে আপনার প্রশ্নের (প্রতিবিম্বের মাধ্যমে) ফলাফল হিসাবে উদাহরণ তৈরি করতে হবে, হাইবারনেট তার জন্য সত্ত্বার নো-আরগ নির্মাতার উপর নির্ভর করে, সুতরাং আপনাকে কোনও নো-আরগ কনস্ট্রাক্টর সরবরাহ করতে হবে। কী স্পষ্ট নয়?
private
কনস্ট্রাক্টর ভুল? java.lang.InstantiationException
এমনকি private
আমার জেপিএ সত্তার জন্য একজন কনস্ট্রাক্টরও দেখছি । রেফারেন্স ।
প্রতিবিম্বের মাধ্যমে প্যারামিটারলেস কনস্ট্রাক্টরের সাথে অবজেক্ট তৈরি করা সহজ, এবং তারপরে নাম পরিবর্তন / নামকরণের দ্বন্দ্ব, কনস্ট্রাক্টরের অভ্যন্তরে অপরিজ্ঞাত যুক্তি যুক্ত করে প্যারামিটারাইজড কন্সট্রাক্টরের নির্বিচার পরামিতিগুলির সাথে ডেটা চেষ্টা করার এবং প্রতিবিম্বের মাধ্যমে ডেটা দিয়ে এর বৈশিষ্ট্যগুলি পূরণ করা অনেক সহজ, প্যারামিটার কোনও বস্তুর বৈশিষ্ট্যের সাথে মিলে না, সেট করে sets
অনেকগুলি ওআরএম এবং সিরিয়ালাইজারের প্যারামিটারলেস কনস্ট্রাক্টরগুলির প্রয়োজন হয়, কারণ প্রতিবিম্বের মাধ্যমে প্যারামটারাইজড কনস্ট্রাক্টরগুলি খুব ভঙ্গুর এবং পরামিতিহীন কনস্ট্রাক্টররা অ্যাপ্লিকেশনটির স্থায়িত্ব এবং বিকাশকারীকে অবজেক্ট আচরণের উপর নিয়ন্ত্রণ উভয়ই সরবরাহ করে।
হাইবারনেট অলস লোডিংয়ের জন্য প্রক্সি ব্যবহার করে। আপনি যদি কোনও কনস্ট্রাক্টর সংজ্ঞায়িত না করেন বা এটিকে বেসরকারী না করেন তবে কয়েকটি জিনিস এখনও কাজ করতে পারে - যেগুলি প্রক্সি প্রক্রিয়াতে নির্ভর করে না। উদাহরণস্বরূপ, কোয়েরি এপিআই ব্যবহার করে অবজেক্টটি লোড করা (কোনও নির্মাণকারী ছাড়া)।
তবে, আপনি যদি সেশন.লোড পদ্ধতি () ব্যবহার করেন তবে আপনি কন্সট্রাক্টরের উপলব্ধতা না থাকায় প্রক্সি জেনারেটর লাইব থেকে ইনস্ট্যান্টেশন এক্সেক্সেশনের মুখোমুখি হবেন।
এই লোকটি একটি অনুরূপ পরিস্থিতি রিপোর্ট করেছে:
http://kristian-domagala.blogspot.com/2008/10/proxy-instantiation-problem-from.html
: জাভা ভাষা বৈশিষ্ট এই অ w শটি যে স্ট্যাটিক এবং অ স্ট্যাটিক ভেতরের শ্রেণীর মধ্যে পার্থক্য ব্যাখ্যা করে পরীক্ষা করে দেখুন http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3
একটি স্থিতিশীল অভ্যন্তর শ্রেণি ধারণাটি জাভা ফাইলে ঘোষিত নিয়মিত সাধারণ শ্রেণীর চেয়ে আলাদা নয়।
যেহেতু হাইবারনেটকে প্রকল্পের উদাহরণস্বরূপ স্বাধীনভাবে প্রজেক্টপিকে ইনস্ট্যান্ট করতে হবে, প্রজেক্টপিকে হয় হয় একটি স্থিতিশীল অভ্যন্তর শ্রেণি হতে হবে, বা এটি নিজের। জাভা ফাইলটিতে ঘোষণা করা উচিত।
রেফারেন্স org.hibernate.InsttiationException: কোনও ডিফল্ট কনস্ট্রাক্টর নয়
হাইবারনেট সত্তা মটরশুটির উদাহরণ তৈরি করতে প্রতিচ্ছবি এপিআই ব্যবহার করে, সাধারণত আপনি যখন কল করেন get()
বা load()
পদ্ধতি করেন। পদ্ধতিটির জন্য Class.newInstance()
এটি ব্যবহৃত হয় এবং এটির no-args
কনস্ট্রাক্টর প্রয়োজন । সুতরাং সত্তা মটরশুটিগুলিতে যদি আপনার কাছে কোনও আরগস নির্মাণকারী না থাকে তবে হাইবারনেট এটি ইনস্ট্যান্ট করতে ব্যর্থ হবে এবং আপনি হাইবারনেট এক্সেপশন পাবেন।
The no-argument constructor is a requirement
ভুল , এবং সমস্ত উত্তরগুলি ব্যাখ্যা করতে কেন এই জিজ্ঞাসাবাদ কিনা এই আসলে তাই, (গৃহীত উত্তর, এমনকি খয়রাত পেয়েছে, সহ) ছাড়া এটা তাই হয় এগিয়ে ভুল । : এই উত্তর দেখার stackoverflow.com/a/29433238/773113