হাইবারনেটের কোনও যুক্তি নির্মাতার প্রয়োজন নেই কেন?


106

নো-আর্গুমেন্ট কনস্ট্রাক্টর একটি প্রয়োজনীয়তা (হাইবারনেটের মতো সরঞ্জামগুলি অবজেক্টগুলি ইনস্ট্যান্ট করতে এই কনস্ট্রাক্টরের প্রতিবিম্ব ব্যবহার করে)।

আমি এই হ্যান্ড-ওয়েভ উত্তরটি পেয়েছি তবে কেউ কি আরও কিছু বলতে পারে? ধন্যবাদ


7
অবগতির জন্য: কথন রয়েছে তা The no-argument constructor is a requirement ভুল , এবং সমস্ত উত্তরগুলি ব্যাখ্যা করতে কেন এই জিজ্ঞাসাবাদ কিনা এই আসলে তাই, (গৃহীত উত্তর, এমনকি খয়রাত পেয়েছে, সহ) ছাড়া এটা তাই হয় এগিয়ে ভুল । : এই উত্তর দেখার stackoverflow.com/a/29433238/773113
মাইক Nakis

4
আপনি জেপিএর সরবরাহকারী হিসাবে হাইবারনেট ব্যবহার করছেন তবে এটি প্রয়োজন।
অমলগোভিনাস

4
আপনি @ মাইকনাকিস- কে ব্লক করেছেন মাইক আপনি যদি জেপিএ (অমলগোভিনাস) এর সরবরাহকারী হিসাবে হাইবারনেট ব্যবহার করছেন তবে হাইবারনেট হ'ল হায়ারনেটকে কেবলমাত্র সেক্ষেত্রে Caused by: org.hibernate.InstantiationException: No default constructor for entity: : hibernate.tutorial.Studentযেভাবে আমার মুখোমুখি হয়েছিল সে হিসাবে প্রতিবেদন করবে - বস্তুগুলি ইনস্ট্যান্টিয়েট করার জন্য হাইবারনেটের একটি ডিফল্ট নির্মাণকারীর প্রয়োজন হয়
মুশি

@ মুশি প্রশ্নটিকে "হাইবারনেট" এবং "orm" দিয়ে ট্যাগ করেছেন, এটি "জেপিএ" দিয়ে ট্যাগ করা হয় না। প্রশ্নে জেপিএর কোনও উল্লেখ নেই।
মাইক নাকিস

4
@ মাইকনাকিস আমি মাইকে সম্মত করছি তবে হাইবারনেট "জেপিএ" প্রয়োগ হিসাবে ব্যবহৃত হয় এবং "জেপিএ" বা "ওআরএম" এর অনুপস্থিতিতে ব্যবহৃত হয় না। সুতরাং, ধারণাটি হাইবারনেট "জেপিএ" প্রয়োগ করছে।
মুশি

উত্তর:


139

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

সিরিয়ালাইজেশন ভিত্তিক হ্যাক রয়েছে যা নো-আরগ কনস্ট্রাক্টর না থাকার আশেপাশে কাজ করতে পারে, যেহেতু সিরিয়ালাইজেশন কনস্ট্রাক্টরকে ডাকে না করে অবজেক্ট তৈরি করতে jvm ম্যাজিক ব্যবহার করে। তবে এটি সমস্ত ভিএম জুড়ে উপলভ্য নয়। উদাহরণস্বরূপ, এক্সস্ট্রিম এমন অবজেক্টগুলির উদাহরণ তৈরি করতে পারে যার সার্বজনীন নো-আরগ নির্মাণকারী নেই, তবে কেবল তথাকথিত "বর্ধিত" মোডে চালিয়ে যা কেবলমাত্র নির্দিষ্ট ভিএমগুলিতে উপলব্ধ। (বিশদটির জন্য লিঙ্কটি দেখুন)) হাইবারনেটের ডিজাইনাররা অবশ্যই সমস্ত ভিএম এর সাথে সামঞ্জস্য বজায় রাখতে পছন্দ করেছেন এবং তাই এই জাতীয় কৌশলগুলি এড়িয়ে চলে এবং Class<T>.newInstance()কোনও নো-আরগ নির্মাণকারী প্রয়োজনে সরকারীভাবে সমর্থিত প্রতিচ্ছবি পদ্ধতিটি ব্যবহার করে ।


31
এফওয়াইআই: কনস্ট্রাক্টরটির সর্বজনীন হওয়ার দরকার নেই। setAccessible(true)এটিতে প্যাকেজ দৃশ্যমানতা থাকতে পারে এবং এতে হাইবারনেট হওয়া উচিত ।
ধুসর

এর ক্রিয়াকলাপগুলির জন্য প্রয়োজনীয় ক্ষেত্রটি সেট করতে আমি কি কোনও ডিফল্ট নির্মাতা দিয়ে একটি কাস্টম ইউজারটাইপ তৈরি করতে সক্ষম?
এল-সামুয়েলস

4
রেফারেন্সের জন্য কোনও ডিফল্ট নির্মাতা (উইন্ডোজের জন্য JDK1.6) অবজেক্টগুলির জন্য তাত্ক্ষণিকতার জন্য ObjectInputStreamকিছু করেsun.reflect.ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToGetInstanceOf, Object.class.getConstructor()).newInstance()
সামায়োনু

Re: It can have package visibility and Hibernate should setAccessible(true)itপ্রতিফলনের মাধ্যমে শ্রেণিটি ইনস্ট্যান্টিয়েট করা মানে কি ? এবং Hibernate should setAccessible(true)মানে কি?
কেভিন মেরিডেথ

ওবজেনিস এটি করেন এবং অনেকগুলি কাঠামো যেমন স্প্রিং-ডেটা এবং মকিতো github.com/easymock/objenesis
এলটিফিশি

47

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

হাইবারনেট ডকুমেন্টেশন বলেছেন:

4.1.1। একটি নো-আর্গুমেন্ট নির্মাণকারী কার্যকর করুন lement

সমস্ত ধ্রুবক শ্রেণীর অবশ্যই একটি ডিফল্ট নির্মাতা থাকতে হবে (যা জনসাধারণের হতে পারে) যাতে হাইবারনেট এগুলি ব্যবহার করে তাত্ক্ষণিক করতে পারে Constructor.newInstance()। হাইবারনেটে রানটাইম প্রক্সি জেনারেশনের জন্য কমপক্ষে প্যাকেজ ভিজিবিলিটি সহ আপনার একটি ডিফল্ট কনস্ট্রাক্টর প্রস্তাবিত।


6
কনস্ট্রাক্টরের দৃশ্যমানতার কথা হিসাবে, আপনি যদি জেপিএ ভি 2.0 ব্যবহার করছেন তবে জেএসআর -317 বলেছে যে নো-আরগ কনস্ট্রাক্টর অবশ্যই প্রকাশ্য বা সুরক্ষিত থাকতে হবে
জোসে আন্দিয়াস 15'15

@ বোজো হ্যালো স্যার, আমার একটি সন্দেহ আছে যে অভ্যন্তরীণ হাইবারনেট যদি অবজেক্ট ইনস্ট্যান্ট করতে কনস্ট্রাক্টর.নেইইইনস্ট্যান্স () ব্যবহার করে তবে কোনও সেটার সংজ্ঞায়িত না করে ক্ষেত্রগুলিতে হাইবারনেট সেট কীভাবে করা যায়?
বিকাশ ভার্মা

আমি কেন কোনও পাবলিক নো-
আরগ

কনস্ট্রাক্টর.ইনইইনস্ট্যানস () আর্গুমেন্ট নেয়, ইস্যুটি (আসলে একটি অ-ইস্যু) সেই যুক্তিগুলিকে ম্যাপিং করছে। হাইবারনেট কেন এই সমস্যাটি সমাধান করেনি তা ধারণা নেই। তুলনার জন্য: জ্যাকসনে @ জেসনক্রিটার টীকাটি এটি করে এবং অপরিবর্তনীয় বস্তুর বেশিরভাগ সুবিধা হয়েছিল।
শে


45

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

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


4
অবশেষে, কেউ যে এটি পায়! আমি এই ফ্রেমওয়ার্কগুলি অবজেক্ট ইনস্ট্যান্টেশন প্রক্রিয়াটিকে অস্পষ্ট করে কাজ করার চেয়ে বেশি সময় ব্যয় করেছি (যা সঠিক নির্ভরতা ইনজেকশন এবং সমৃদ্ধ বস্তুর আচরণের জন্য একেবারে গুরুত্বপূর্ণ)। তদ্ব্যতীত, জাভা প্রতিবিম্ব আপনাকে নতুনআইন্সট্যান্স () ব্যবহার না করে অবজেক্ট তৈরি করতে দেয়। জেডিকে ১.১-এর পরে getDeclaredConstructors পদ্ধতিটি প্রতিবিম্ব এপিআইতে রয়েছে। এটি ভীতিজনক যে জেপিএর বিশেষ ডিজাইনাররা এটি উপেক্ষা করেছেন।
17:44 এ ড্রবব

এটা ভুল. হাইবারনেট যদি জেপিএ সরবরাহকারী হিসাবে অধ্যবসায়ের জন্য ব্যবহৃত হয়, তবে এটির জন্য একটি ডিফল্ট নির্মাণকারীর প্রয়োজন হয় অন্যথায় নিম্নলিখিতগুলি নিশ্চিত করে Caused by: org.hibernate.InstantiationException: No default constructor for entity: : hibernate.tutorial.Studentযা সম্প্রতি ঘটেছিল কারণ javax.persistence.*;এটি org.hibernateতৈরি হয়েছিল এবং কেবল তৈরি করার সময়Session, SessionFactory, and Configuration
মুশি

4
@ মুশি এটি নিখুঁতভাবে সঠিক, কারণ ক) প্রশ্নটি হাইপারনেট সম্পর্কিত, জেপিএর একক উল্লেখ ছাড়াই, এবং খ) আমার জবাবের দ্বিতীয় বাক্যে আমি স্পষ্টভাবে উল্লেখ করতে পারি যে হাইপারনেট না করলেও জেপিএর জন্য ডিফল্ট নির্মাণকারী প্রয়োজন।
মাইক নাকিস

36

হাইবারনেট একটি ওআরএম কাঠামো যা ক্ষেত্র বা সম্পত্তি অ্যাক্সেস কৌশল সমর্থন করে। তবে এটি কনস্ট্রাক্টর-ভিত্তিক ম্যাপিং সমর্থন করে না - সম্ভবত আপনি কী চান? - কারণ কিছু সমস্যা

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>);

কোন ব্যক্তির অবজেক্টটি পুনরুদ্ধার করতে হাইবারনেট কল করা উচিত কোন নির্মাণকারীর? তুমি কি দেখতে পারো ?

এবং পরিশেষে, প্রতিবিম্বটি ব্যবহার করে হাইবারনেট কোনও নো-আরগ কনস্ট্রাক্টরের মাধ্যমে কোনও শ্রেণি ইনস্ট্যান্ট করতে পারে। সুতরাং আপনি কল যখন

Person person = (Person) session.get(Person.class, <IDENTIFIER>);

হাইবারনেট নীচে আপনার ব্যক্তি বস্তু ইনস্ট্যান্ট করবে

Person.class.newInstance();

যা এপিআই ডকুমেন্টেশন অনুসারে

ক্লাসটি তাত্ক্ষণিকভাবে শূন্য যুক্তি তালিকার একটি নতুন এক্সপ্রেশন দ্বারা

গল্পের নৈতিক

Person.class.newInstance();

অনুরূপ

new Person();

আর কিছু না


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

4
এটি হাইবারনেট দলের যুক্তিযুক্ত হতে পারে। তবে প্রকৃতপক্ষে, সমস্যাগুলির সমাধান করা যেতে পারে (১) হয় কোনও টিকা প্রয়োজন, অথবা অন্যথায় কেবলমাত্র একজন নির্ধারক থাকলে এবং (২) শ্রেণি.ডেটড্লেয়ার্ড কনস্ট্রাক্টর ব্যবহার করে একটি অ-ডিফল্ট নির্মাণকারী ব্যবহার করুন। এবং Class.newInstance () এর পরিবর্তে Constructor.newInstance () ব্যবহার করা হচ্ছে। জাভা 8 এর আগে এক্সএমএল / টীকাগুলিতে উপযুক্ত ম্যাপিংয়ের প্রয়োজন হবে, তবে এটি সম্পূর্ণভাবে কার্যকর able
17'10

ঠিক আছে, তাই হাইবারনেট ডিফল্ট কনস্ট্রাক্টর থেকে অবজেক্ট তৈরি করে এবং তারপরে এটি ক্ষেত্রগুলির জন্য সেটার ব্যবহার করে nameএবং age? তা না হলে এটি পরে অন্য কনস্ট্রাক্টর ব্যবহার করে?
tryingHard

4
@ryingHard হ্যাঁ, একবার তাত্ক্ষণিকভাবে, হাইবারনেট সেটার বা ক্ষেত্রগুলি ব্যবহার করে - এটি অ্যাক্সেস কৌশলের উপর নির্ভর করে। ডিফল্টরূপে, আইডির টীকাগুলির স্থান নির্ধারণ ডিফল্ট অ্যাক্সেস কৌশল দেয়। দেখুন docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/...
আর্থার রোনাল্ড

6

প্রকৃতপক্ষে, আপনি ক্লাস ইনস্ট্যান্ট করতে পারেন যার কোনও 0-আরগস নির্মাণকারী নেই; আপনি একটি শ্রেণীর নির্মাতাদের একটি তালিকা পেতে পারেন, একটি বাছাই করতে এবং বগাস পরামিতিগুলির সাথে এটি আবেদন করতে পারেন।

যদিও এটি সম্ভব, এবং আমি অনুমান করি এটি কার্যকর হবে এবং সমস্যাযুক্ত হবে না, আপনাকে সম্মতি জানাতে হবে যে এটি বেশ অদ্ভুত।

হাইবারনেট যেভাবে বস্তুগুলি তৈরি করে (আমি বিশ্বাস করি এটি 0-আরগ কনস্ট্রাক্টরকে আহ্বান করে এবং তারপরে এটি সম্ভবত প্রতিবিম্বের মাধ্যমে উদাহরণের ক্ষেত্রগুলিকে সরাসরি পরিবর্তন করে Perhaps সম্ভবত এটি সেটারগুলি কল করতে জানে) কীভাবে কোনও অবজেক্টটি নির্মাণ করা হবে তার বিপরীতে কিছুটা যায় against জাভা- উপযুক্ত পরামিতিগুলির সাথে কনস্ট্রাক্টরকে অনুরোধ করুন যাতে নতুন অবজেক্টটি আপনার পছন্দসই বস্তু। আমি বিশ্বাস করি যে কোনও বস্তুকে তাত্ক্ষণিকভাবে তা পরিবর্তন করা কিছুটা "অ্যান্টি-জাভা" (বা আমি বলব, বিরোধী খাঁটি তাত্ত্বিক জাভা) - এবং অবশ্যই আপনি যদি সরাসরি ক্ষেত্রের হেরফেরের মাধ্যমে এটি করেন তবে এটি এনক্যাপসুলেশন হয় এবং সমস্ত অভিনব এনক্যাপসুলেশন স্টাফ থাকে believe ।

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

এটি বলে এবং হাইবারনেট পদ্ধতিটি খুব "পরিষ্কার" নয় বলে দেখে 0-আরগ নির্মাতা থাকার বাধ্যবাধকতা কঠোরভাবে প্রয়োজন হয় না, তবে আমি কিছুটা প্রয়োজনীয়তা বুঝতে পারি, যদিও আমি বিশ্বাস করি তারা এটি নিখুঁতভাবে "সঠিক পথে করেছেন" "ভিত্তি, যখন তারা এর অনেক আগে" যথাযথ উপায় "(যুক্তিসঙ্গত কারণে যাই হোক না কেন) থেকে বিপথগামী হয়েছিল।


5

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


কোন অবস্থার অধীনে একজন privateকনস্ট্রাক্টর ভুল? java.lang.InstantiationExceptionএমনকি privateআমার জেপিএ সত্তার জন্য একজন কনস্ট্রাক্টরও দেখছি । রেফারেন্স
কেভিন মেরিডেথ

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

2

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

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


আমি যুক্তি দিয়েছি যে একটি সমৃদ্ধ ডোমেন অবজেক্ট হওয়ার দরকার হতে পারে তার জন্য সম্পূর্ণ পরিবর্তন আনতে বাধ্য করা আরও ভঙ্গুর (আপনার সত্তাগুলি যদি কাজ করার জন্য ডেটা বিশিষ্ট ব্যাগের প্রয়োজন হয় তবে এটি কোনও ORM এর বেশি নয়) আমি চাই কারণ আমি চাই একজন কনস্ট্রাক্টর তবে পরিবর্তে সমৃদ্ধ সেটার কলগুলির একটি অপরিজ্ঞাত অর্ডার রয়েছে) ... তবে +1 কারণ আপনি স্বীকার করেছেন যে
আর্গুমেন্ট

2

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

তবে, আপনি যদি সেশন.লোড পদ্ধতি () ব্যবহার করেন তবে আপনি কন্সট্রাক্টরের উপলব্ধতা না থাকায় প্রক্সি জেনারেটর লাইব থেকে ইনস্ট্যান্টেশন এক্সেক্সেশনের মুখোমুখি হবেন।

এই লোকটি একটি অনুরূপ পরিস্থিতি রিপোর্ট করেছে:

http://kristian-domagala.blogspot.com/2008/10/proxy-instantiation-problem-from.html


0

: জাভা ভাষা বৈশিষ্ট এই অ w শটি যে স্ট্যাটিক এবং অ স্ট্যাটিক ভেতরের শ্রেণীর মধ্যে পার্থক্য ব্যাখ্যা করে পরীক্ষা করে দেখুন http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3

একটি স্থিতিশীল অভ্যন্তর শ্রেণি ধারণাটি জাভা ফাইলে ঘোষিত নিয়মিত সাধারণ শ্রেণীর চেয়ে আলাদা নয়।

যেহেতু হাইবারনেটকে প্রকল্পের উদাহরণস্বরূপ স্বাধীনভাবে প্রজেক্টপিকে ইনস্ট্যান্ট করতে হবে, প্রজেক্টপিকে হয় হয় একটি স্থিতিশীল অভ্যন্তর শ্রেণি হতে হবে, বা এটি নিজের। জাভা ফাইলটিতে ঘোষণা করা উচিত।

রেফারেন্স org.hibernate.InsttiationException: কোনও ডিফল্ট কনস্ট্রাক্টর নয়


0

হাইবারনেট সত্তা মটরশুটির উদাহরণ তৈরি করতে প্রতিচ্ছবি এপিআই ব্যবহার করে, সাধারণত আপনি যখন কল করেন get()বা load()পদ্ধতি করেন। পদ্ধতিটির জন্য Class.newInstance()এটি ব্যবহৃত হয় এবং এটির no-argsকনস্ট্রাক্টর প্রয়োজন । সুতরাং সত্তা মটরশুটিগুলিতে যদি আপনার কাছে কোনও আরগস নির্মাণকারী না থাকে তবে হাইবারনেট এটি ইনস্ট্যান্ট করতে ব্যর্থ হবে এবং আপনি হাইবারনেট এক্সেপশন পাবেন।

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