বিভ্রান্তি: @ নটনুল বনাম। জেপিএ এবং হাইবারনেটের সাথে @ কলাম (অবিচ্ছিন্ন = মিথ্যা)


242
  1. এগুলি যখন একটি ক্ষেত্র / গেটে উপস্থিত হয়, তখন তাদের @Entityমধ্যে পার্থক্য কী? (আমি হাইবারনেটের মাধ্যমে সত্তাকে অবিচল রেখেছি )।

  2. এগুলির প্রত্যেকে কোন ফ্রেমওয়ার্ক এবং / বা নির্দিষ্টকরণের সাথে সম্পর্কিত?

  3. @NotNullমধ্যে অবস্থিত javax.validation.constraints। ইন javax.validation.constraints.NotNulljavadoc এটা বলে

    টীকাযুক্ত উপাদান অবশ্যই নথ হবে না

    তবে এটি ডাটাবেসে উপাদানটির প্রতিনিধিত্বের কথা বলে না, তাই আমি কেন nullable=falseকলামটিতে বাধা যুক্ত করব ?

উত্তর:


328

@NotNullএকটি জেএসআর 303 শিম বৈধকরণ টিকা ann এটি ডাটাবেসের সীমাবদ্ধতার সাথে কিছুই করার নেই। যেহেতু হাইবারনেট হ'ল জেএসআর 303 এর রেফারেন্স বাস্তবায়ন, তবে এটি বুদ্ধিমানের সাথে এই সীমাবদ্ধতাগুলি গ্রহণ করে এবং এটি আপনার জন্য ডাটাবেসের সীমাবদ্ধতায় অনুবাদ করে, সুতরাং আপনি একটির দামের জন্য দুটি পান। @Column(nullable = false)হ'ল জেপিএ হ'ল কোনও কলামকে নাল-শূন্য ঘোষণা করার। অর্থাত্ পূর্বেরটি বৈধতার জন্য এবং পরবর্তীকালে ডাটাবেস স্কিমার বিবরণ নির্দেশ করার জন্য is বৈধতা টীকাগুলিতে আপনি হাইবারনেট থেকে কিছু অতিরিক্ত (এবং স্বাগত!) সহায়তা পাচ্ছেন।


2
ধন্যবাদ! সুতরাং যদি আমি চাই যে আমার জেপিএ অধ্যবসায় হাইবারনেট বাস্তবায়নের সাথে আবদ্ধ না হয় (অর্থাত্ ইজেবি 3 তে পরিবর্তন করা) তবে আমাকে উভয় টীকা ব্যবহার করতে হবে (ক্ষেত্র এবং এর কলাম উভয়ই নালকে নিষিদ্ধ করতে)?
16:52

3
আমি জানি না। কোনও স্পেসিফিকেশন নেই যা বলে যে কোনও জেপিএ সরবরাহকারী অবশ্যই জেএসআর 303 টি টীকা সনাক্ত করতে পারে, তবে এর অর্থ এই নয় যে অন্যান্য সরবরাহকারীরা তা গ্রহণ করে না। আমি কিছু বলতে পারি না কি করে বা না।
রায়ান স্টুয়ার্ট

7
জেপিএ সরবরাহকারীদের জেএসআর 303 বাস্তবায়ন সরবরাহ করার প্রয়োজন নেই তবে কোনও তৃতীয় পক্ষের জেএসআর 303 প্রয়োগের সাথে সংহত করার দক্ষতা সরবরাহ করার জন্য প্রয়োজনীয় স্পেসিফিকেশন অনুযায়ী। সুতরাং হাইবারনেট জেএসআর 303 সরবরাহ করার সময় আপনি যে কোনও কারণে তাদের ব্যবহার না করার এবং অন্য কারও সাথে যাওয়ার বা জেপিআর বাস্তবায়ন যেমন ওএসপিআরএ ব্যবহার করার সিদ্ধান্ত নিতে পারেন এবং জেএসআর 303 সরবরাহ করার জন্য অন্য কাউকে ব্যবহার করতে পারেন A এছাড়াও নোট হাইবারনেটের জেপিএ বাস্তবায়নও EJB3. এটি বলা ভুল নয় 'যদি আমি চাই আমার জেপিএ অধ্যবসায় হাইবারনেট বাস্তবায়নের সাথে আবদ্ধ না হয় (অর্থাত্ ইজেবি 3 তে পরিবর্তন করা)' জেপিএ ইজেবি 3 স্পেসিফিকেশনের অংশ is
শাহজেব

5
@ শাহজেব: কে জেএসআর 303 বৈধতা সমর্থন করে / সরবরাহ করে সে সম্পর্কে প্রশ্ন নেই। এটা তোলে যা সম্পর্কে ORM (গুলি) চিনতে JSR 303 টীকা মত @NotNull, @Size, @Min, @Maxইত্যাদি এবং ডাটাবেস সীমাবদ্ধতার মধ্যে যারা অনুবাদ করুন।
রায়ান স্টুয়ার্ট

1
হ্যাঁ তবে আমার মন্তব্যটি পরবর্তী মন্তব্যে আপনি কী জানেন না সে বিষয়ে যা বলেছিল তার প্রসঙ্গে বৈধ।
শাহজেব

18

হাইবারনেট JPA প্রদানকারী অতি সাম্প্রতিক সংস্করণটি মত শিম বৈধতা সীমাবদ্ধতার (JSR 303) প্রযোজ্য @NotNull(ধন্যবাদ ডিফল্টরূপে DDL করার hibernate.validator.apply_to_ddl propertyডিফল্ট true)। তবে অন্যান্য জেপিএ সরবরাহকারীরা এমনটি করার ক্ষমতা রাখার বা এমনকি করার কোনও গ্যারান্টি নেই।

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

আপনি চাইলে জেপিএ টীকাটি ব্যবহার করে @Column(nullable = false)আপনার পছন্দসই ডাটাবেসের সীমাবদ্ধতার সাথে টেবিল কলাম তৈরি করার জন্য সঠিক ডিডিএল উত্পন্ন করার জন্য জেপিএ সরবরাহকারীকে ইঙ্গিত দেওয়া উচিত। আপনি যদি হাইবারনেটের মতো জেপিএ সরবরাহকারীর উপর নির্ভর করতে পারেন বা ডিফল্টরূপে ডিডিএলে শিম বৈধকরণের সীমাবদ্ধতাগুলি প্রয়োগ করেন তবে আপনি সেগুলি বাদ দিতে পারেন।


10

আকর্ষণীয়ভাবে লক্ষণীয়, সমস্ত উত্স জোর দেয় যে @ কলাম (নালাম = মিথ্যা) কেবল ডিডিএল প্রজন্মের জন্য ব্যবহৃত হয়।

যাইহোক, @ নটনুল টিকা নেই এবং হাইবারনেট.এচেক_নুল্যাবিলিটি বিকল্পটি সত্যতে সেট করা থাকলেও হাইবারনেট অস্তিত্ব টিকিয়ে রাখার জন্য বৈধতা সম্পাদন করবে।

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

হাইবারনেট.চেক_অনুভবতা বিকল্প সম্পর্কে আরও তথ্য এখানে পাওয়া যায়: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping


7

জেপিএ @Columnটিকা

nullableএর অ্যাট্রিবিউট @Columnটীকা দুই উদ্দেশ্য রয়েছে:

  • এটি স্কিমা প্রজন্মের সরঞ্জাম দ্বারা ব্যবহৃত হয়
  • এটি হায়ারনেট দ্বারা অধ্যবসায় বিষয়বস্তু ফ্লাশ করার সময় ব্যবহার করা হয়

স্কিমা জেনারেশন সরঞ্জাম

এইচবিএম 2 ডিডিএল স্কিমা জেনারেশন সরঞ্জাম বিবৃতি উত্পন্ন করার সময় সংশ্লিষ্ট সারণী কলামের জন্য সীমাবদ্ধতার @Column(nullable = false)সত্তাকে অ্যাট্রিবিউটটি অনুবাদ করে ।NOT NULLCREATE TABLE

হাইবারনেট ইউজার গাইডে আমি যেমন ব্যাখ্যা করেছি , ডাটাবেস স্কিমা তৈরির জন্য HBM2DDL পদ্ধতিতে নির্ভর করার পরিবর্তে ফ্লাইওয়ের মতো একটি সরঞ্জাম ব্যবহার করা ভাল ।

দৃistence়তা প্রসঙ্গে ফ্লাশ

দৃistence়তা প্রসঙ্গে ফ্লাশ করার সময়, হাইবারনেট ওআরএম @Column(nullable = false)সত্তা বৈশিষ্ট্যটিও ব্যবহার করে :

new Nullability( session ).checkNullability( values, persister, true );

যদি বৈধতা ব্যর্থ হয়, হাইবারনেট একটি নিক্ষেপ করবে PropertyValueException, এবং INSERT বা আপডেটের বিবৃতিটি প্রয়োজনীয়ভাবে সম্পাদন করতে বাধা দেয়:

if ( !nullability[i] && value == null ) {
    //check basic level one nullablilty
    throw new PropertyValueException(
            "not-null property references a null or transient value",
            persister.getEntityName(),
            persister.getPropertyNames()[i]
        );    
}

হাইবারনেট ফ্লাশ প্রক্রিয়া কীভাবে কাজ করে সে সম্পর্কে আরও তথ্যের জন্য এই নিবন্ধটি দেখুন

শিম বৈধকরণ @NotNullটিকা

@NotNullটীকা সিম ভ্যালিডেশন দ্বারা সংজ্ঞায়িত করা হয় এবং, তাই হাইবারনেট ORM ঠিক সবচেয়ে জনপ্রিয় JPA বাস্তবায়ন হয়, সবচেয়ে জনপ্রিয় সিম ভ্যালিডেশন বাস্তবায়ন হাইবারনেট ভ্যালিডেটার ফ্রেমওয়ার্ক।

হাইবারনেট ওআরএম-এর সাথে হাইবারনেট ভ্যালিডেটর ব্যবহার করার সময়, হাইবারনেট ভ্যালিডেটর ConstraintViolationসত্তাকে বৈধতা দেওয়ার সময় একটি নিক্ষেপ করবে ।


আপনি কেন বলেছেন যে ফ্লাইওয়ে স্কিমা তৈরির চেয়ে ভাল?
অ্যান্ড্রোনিকাস

1
এটি একটি ভাল পর্যবেক্ষণ। আমি একটি রেফারেন্স লিঙ্ক সহ উত্তর আপডেট।
ভ্লাদ মিহালসিয়া

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