বসন্তে স্প্রিং.জেপা.ইবার্নেট.ডিডিএল-অটো সম্পত্তি ঠিক কীভাবে কাজ করে?


126

আমি আমার স্প্রিং বুট অ্যাপ প্রকল্পে কাজ করছি এবং লক্ষ্য করেছি যে, কখনও কখনও অন্য সার্ভারে (এসকিউএল সার্ভার) আমার ডেটাবেসটিতে একটি সংযোগের সময় ত্রুটি হয়। এটি বিশেষত ঘটে যখন আমি কিছু স্ক্রিপ্ট স্থানান্তর করার চেষ্টা করি FlyWayতবে এটি বেশ কয়েকটি চেষ্টার পরে কাজ করে।

তারপরে আমি লক্ষ্য করেছি যে আমি spring.jpa.hibernate.ddl-autoআমার সম্পত্তি ফাইলগুলিতে নির্দিষ্ট করেছিলাম না । আমি কিছু গবেষণা করে দেখেছি যে এটি spring.jpa.hibernate.ddl-auto= create-dropবিকাশে যুক্ত করার পরামর্শ দেওয়া হচ্ছে । এবং এটিকে পরিবর্তন করুন: spring.jpa.hibernate.ddl-auto= noneউত্পাদনে।

তবে আমি আসলে বুঝতে পারি নি কীভাবে এটি সত্যিই কাজ করে এবং কীভাবে হাইবারনেট ডেটাবেস স্কিমা ব্যবহার create-dropবা noneমান ব্যবহার করে । আপনি দয়া করে প্রযুক্তিগতভাবে ব্যাখ্যা করতে পারেন যে এটি কীভাবে কার্যকরী হয় এবং এই সম্পত্তিটি বিকাশে এবং কোনও প্রোডাকশন সার্ভারে ব্যবহারের জন্য সুপারিশগুলি কী। ধন্যবাদ


1
এফডাব্লুআইডাব্লু জেপিএ ২.১ এর একটি স্ট্যান্ডার্ড সম্পত্তি জাভ্যাক্স.পার্পিশন.সেমি-জেনারেশন.ড্যাটাবেস.অ্যাকশন রয়েছে তাই স্কিমা জেনারেশনের জন্য জেপিএ বিক্রেতার নির্দিষ্ট বৈশিষ্ট্যগুলি ব্যবহার করার প্রয়োজনটি সত্যিই দেখবেন না।
নীল স্টকটন

@ নীলস্টকটন একটি ধারণা যা আমরা হাইবারনেট 6 এর সাথে সন্ধান করছি তা বিভাগের ভিত্তিতে স্কিমার উত্পাদন আলাদাভাবে নিয়ন্ত্রণ করতে সক্ষম হবার ক্ষমতা; উদাহরণস্বরূপ আপনার orm টেবিলগুলি হতে পারে noneতবে আপনি চাইলে আপনার হাইবারনেট অনুসন্ধান এবং এনভার্স টেবিলগুলি ব্যবহার করে উত্পন্ন করা যেতে পারে updateকারণ সেগুলি প্রকল্পগুলির দ্বারা অভ্যন্তরীণভাবে পরিচালিত হয় এবং আপনি নিজে নিজে সেগুলি পরিচালনা করতে চান না। এখনই আমরা সমস্ত টেবিলের উত্স / উত্স নির্বিশেষে বিশ্বব্যাপী এটি নিয়ন্ত্রণ করি। আপনি যদি এটি ব্যবহার করতে চান তবে এটি বিক্রেতা-নির্দিষ্ট বিকল্পগুলি ব্যবহার করার কারণটি আরও বাড়িয়ে তুলবে।
নরোস

উত্তর:


212

রেকর্ডের জন্য, spring.jpa.hibernate.ddl-autoসম্পত্তিটি হ'ল স্প্রিং ডেটা জেপিএ নির্দিষ্ট এবং এটি এমন কোনও মান নির্দিষ্ট করার উপায় যা অবশেষে এটি যে সম্পত্তিতে জেনে থাকে তার অধীনে হাইবারনেটকে দেওয়া হবে hibernate.hbm2ddl.auto

মান create, create-drop, validate, এবং updateমূলত প্রভাবিত কিভাবে স্কিমা টুল ব্যবস্থাপনা স্টার্টআপে ডাটাবেসের স্কিমা নিপূণভাবে হবে।

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

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

সাধারণত পরীক্ষার ক্ষেত্রে, আপনি সম্ভবত create-dropআপনার স্কিমা তৈরি করতে ব্যবহার করবেন , আপনার পরীক্ষার ক্ষেত্রে কিছু মক ডেটা যুক্ত হবে, আপনি পরীক্ষা চালাবেন এবং তারপরে টেস্ট কেস ক্লিনআপ চলাকালীন স্কিমা অবজেক্টগুলি খালি ডাটাবেস রেখে দেওয়া হবে leaving

বিকাশে, বিকাশকারীরা updateপুনরায় চালু হওয়ার পরে নতুন সংযোজন যুক্ত করতে স্কিমাটি স্বয়ংক্রিয়ভাবে সংশোধন করতে ব্যবহার করতে দেখা যায় common তবে আবার বুঝতে হবে, এটি পূর্ববর্তী মৃত্যুদন্ড কার্যকর হতে পারে এমন কোনও কলাম বা সীমাবদ্ধতা সরিয়ে দেয় না।

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


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

1
আমরা যদি এই সম্পত্তিটি নির্দিষ্ট না করি তবে কী হবে? উদাহরণস্বরূপ, আমার নিজস্ব <শিম আইডি = "সেশনফ্যাক্টরি" শ্রেণি = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <প্রপ কি = "হাইবারনেট.hbm2ddl.auto"> আপডেট </ p> আমার এই ছিল এবং কোনও কারণে আমার টেবিলগুলি সর্বদা বাদ দেওয়া হত, যতক্ষণ না আমি উপরে বর্ণিত সম্পত্তি যুক্ত না করি ;; PS: কোড নমুনার জন্য দুঃখিত)
Igan আয়ন

11
validateপ্রোডাকশন এনভ কেন নয় ?
শমল করুণারথনে

20
@ শামালকারুনারথনে অ্যাপ্লিকেশনগুলি validateউত্পাদনে ব্যবহার করতে পারে তবে সাধারণত আপনার মান / পরীক্ষার পরিবেশে আপনি যে ডেটাবেস স্ক্রিপ্টগুলি লিখেছেন বা আপনার ডাটাবেস স্থানান্তর সরঞ্জামটিতে প্রয়োগ করেছেন তা যাচাই করতে এটি আপনার সেট করা উচিত। validateউত্পাদনে ব্যবহার না করার আরেকটি কারণ হ'ল এটি আপনার অ্যাপ্লিকেশনটির প্রারম্ভিক প্রক্রিয়া চলাকালীন একটি বাধা হয়ে দাঁড়াতে পারে, বিশেষত যদি আপনার অবজেক্টের মডেল আকারে বেশ বিস্তৃত হয় বা যদি নেটওয়ার্ক সংক্রান্ত অন্যান্য কারণগুলি কার্যকর হয়।
নারোস

1
একটি নির্দিষ্ট স্ট্যাক ব্যতীত অনুমান করা কঠিন; যাইহোক, আমার প্রথম অনুমানটি হবে যে orderএসকিউএল পার্সার দ্বারা ভুল ব্যাখ্যা করা হচ্ছে যেহেতু এটি একটি কীওয়ার্ড যদি এটি এড়ানো যায় না।
নারোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.