হাইবারনেট hbm2ddl.auto কনফিগারেশনের সম্ভাব্য মানগুলি কী এবং তারা কী করে


1084

আপডেট, রফতানি এবং যে মানগুলি দেওয়া যেতে পারে সে সম্পর্কে আমি আরও জানতে চাই যে আপডেটটি hibernate.hbm2ddl.auto
কখন ব্যবহার করতে হবে এবং কখন নয়? এবং বিকল্প কি?

এগুলি এমন পরিবর্তন যা ডিবি-র মাধ্যমে ঘটতে পারে:

  • নতুন টেবিল
  • পুরানো টেবিলগুলিতে নতুন কলাম
  • কলামগুলি মোছা হয়েছে
  • একটি কলামের ডেটা ধরণ পরিবর্তিত হয়েছে
  • একধরণের কলাম এর বৈশিষ্ট্যগুলি পরিবর্তন করে
  • টেবিল বাদ পড়েছে
  • একটি কলামের মান পরিবর্তিত হয়েছে

প্রতিটি ক্ষেত্রে সবচেয়ে ভাল সমাধান কি?

উত্তর:


1082

থেকে সম্প্রদায় ডকুমেন্টেশন :

হাইবারনেট.hbm2ddl.auto সেশনফ্যাক্টরিটি তৈরি হওয়ার সময় স্বয়ংক্রিয়ভাবে স্কিমা ডিডিএল ডেটাবেজে স্বীকৃত বা রফতানি করে। সেশন-ফ্যাক্টরি স্পষ্টভাবে বন্ধ হয়ে গেলে তৈরি-ড্রপ সহ, ডাটাবেস স্কিমা বাদ দেওয়া হবে।

যেমন বৈধতা | আপডেট | তৈরি | তৈরি ড্রপ

সুতরাং সম্ভাব্য বিকল্পগুলির তালিকাটি হ'ল

  • বৈধতা দিন : স্কিমাটি বৈধ করুন, ডাটাবেসে কোনও পরিবর্তন করে না।
  • আপডেট : স্কিমা আপডেট করুন।
  • তৈরি করুন : পূর্ববর্তী ডেটা ধ্বংস করে স্কিমা তৈরি করে।
  • তৈরি-ড্রপ : সেশনফ্যাক্টরি স্পষ্টভাবে বন্ধ হয়ে গেলে সাধারণত অ্যাপ্লিকেশন বন্ধ হয়ে গেলে স্কিমাটি ড্রপ করুন।
  • কিছুই নয় : স্কিমা দিয়ে কিছুই করে না, ডাটাবেসে কোনও পরিবর্তন করে না

এই বিকল্পগুলি বিকাশকারী সরঞ্জামগুলি এবং কোনও উত্পাদন স্তরের ডাটাবেসগুলির সুবিধার্থে নয় বলে মনে করা হচ্ছে, আপনি নিম্নলিখিত প্রশ্নটি একবার দেখতে চান; হাইবারনেট: hbm2ddl.auto = উত্পাদনে আপডেট?


14
বৈধ মানগুলির জন্য কেবল হাইবারনেট ডকুমেন্টটি পড়ুন, এটিতে বলা হয়েছে: "যেমন" ... অন্য কোনও বৈধ মান আছে কি?
টা সাস

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

4
বৈধতা বলছে স্কিমা যাচাই করুন, এর অর্থ কী?
হুসেন আখতার ওয়াহিদ 'ঘুরি'

6
আপনি হাইবারনেট কিছু না করতে চাইলে আপনি 'অর্ডওয়ার্ক', বা 'কবুতর' বা অন্য কোনও শব্দও ব্যবহার করতে পারেন। আমি অবশ্যই এটি সুপারিশ করব না!
ওয়ার্ড

2
তৈরি-ড্রপ বিকল্পটিতে একটি ছোট সংযোজন। যদি এই বিকল্পটি ব্যবহার করা হয় তবে এটি পুরো স্কিমাটি বাদ দেয় না পরিবর্তে এটি টেবিলগুলি ফেলে দেয় যার ম্যাপিংগুলি এটি চলাকালীন উপলব্ধ। উদাহরণস্বরূপ, যদি স্কিমা এস এর সাথে একটি ডাটাবেসে এ, বি, সি সারণী এবং জাভা কোডের এ এবং বি ম্যাপিং থাকে তবেই হাইবারনেট টেবিল সি ছাড়বে না
আদিত্য

194

এটি সম্পূর্ণরূপে অক্ষম করার জন্য "কিছুই নয়" এর অনিবন্ধিত মান রয়েছে।


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

আমি এই জাতীয় কিছু জিজ্ঞাসা করতে চলেছিলাম। আমার উদ্দেশ্য শুরুর সময় হ্রাস করা।
digao_mb

46
'খালি স্ট্রিং' 'কিছুই নয়' এর চেয়ে ভাল । 'কিছুই নয়' ব্যবহার করতে, আপনি সতর্কতা বার্তাটি পাবেন: org.hibernate.cfg.SettingsFactory - "হাইবারনেট।
Hbm2ddl.auto

14
আমি এটা প্যাচ করেছি। সুস্পষ্টভাবে বৈধ ধ্রুবক হিসাবে "কিছুই নয়" যুক্ত করা হয়েছে।
স্যান 11

9
আমি অন্যদের চেয়ে "হাইবারনেট। Hbm2ddl.auto
স্নেগ

161

কনফিগারেশন সম্পত্তি বলা হয় hibernate.hbm2ddl.auto

আমাদের বিকাশের পরিবেশে আমরা hibernate.hbm2ddl.auto=create-dropপ্রতিবার স্থাপন করার সময় একটি পরিষ্কার ডাটাবেস ফেলে এবং তৈরি করতে সেট করেছিলাম, যাতে আমাদের ডাটাবেস একটি পরিচিত অবস্থায় থাকে।

তত্ত্ব অনুসারে, আপনি hibernate.hbm2ddl.auto=updateআপনার মডেলটির পরিবর্তনগুলি সহ আপনার ডাটাবেস আপডেট করতে সেট করতে পারেন , তবে আমি কোনও প্রোডাকশন ডাটাবেসে বিশ্বাস করি না। ডকুমেন্টেশনের পূর্ববর্তী সংস্করণ বলেছিল যে এটি পরীক্ষামূলক ছিল, কমপক্ষে; আমি বর্তমান অবস্থা জানি না।

সুতরাং, আমাদের উত্পাদন ডাটাবেসের জন্য, সেট করবেন না hibernate.hbm2ddl.auto- ডিফল্টটি কোনও ডাটাবেস পরিবর্তন না করে। পরিবর্তে, আমরা ম্যানুয়ালি একটি এসকিউএল ডিডিএল আপডেট স্ক্রিপ্ট তৈরি করি যা একটি সংস্করণ থেকে অন্য সংস্করণে পরিবর্তনগুলি প্রয়োগ করে।


5
প্রকৃতপক্ষে, ডকুমেন্টেশন অনুসারে ক্রিয়ে-ড্রপ ডাটাবেস সারণি তৈরি করে এবং সেশন কারখানাটি স্পষ্টভাবে বন্ধ হয়ে গেলে সেগুলি ড্রপ করে। সেশন কারখানাটি তৈরি হওয়ার সময় এটি টেবিলগুলি বাদ দেয় না
ফ্রান্স

4
না, সেশনফ্যাক্টরিটি তৈরি হওয়ার পরে টেবিলগুলি ড্রপ এবং ড্রপ তৈরি করে উভয়ই সেশনফ্যাক্টরি বন্ধ হয়ে গেলে টেবিলগুলি ড্রপ করে। দেখুন stackoverflow.com/a/6752698/1536382
Testo Testini

হাইবারনেট.hbm2ddl.auto = উত্পাদন ড্রপ তৈরির ফলে উত্পাদনে বেশ কয়েকটি সংযোগের সময়সীমা শেষ হতে পারে?
মেটটাইবি

51

আমি আপনার ডিবি আপডেট করার জন্য তরল পদার্থ ব্যবহার করব । হাইবারনেটের স্কিমা আপডেট বৈশিষ্ট্যটি কোনও বিকাশকারী যখন তাদের নতুন বৈশিষ্ট্য বিকাশ করছে তখন সত্যিই ঠিক আছে ok উত্পাদনের পরিস্থিতিতে ডিবি আপগ্রেডকে আরও সাবধানে পরিচালনা করা দরকার।


6
দেখুন stackoverflow.com/questions/221379/... কেন তুমি উৎপাদনের জন্য hbm2ddl ব্যবহার করা উচিত নয় জন্য।
নাথান ভক্সল্যান্ড

51

যদিও এটি বেশ পুরাতন পোস্ট তবে আমি বিষয়টি নিয়ে কিছু গবেষণা করেছিলাম তাই এটি ভাগ করে নেওয়ার চিন্তাভাবনা করেছি।

hibernate.hbm2ddl.auto

ডকুমেন্টেশন অনুসারে এর চারটি বৈধ মান থাকতে পারে:

তৈরি | আপডেট | বৈধ করা | তৈরি ড্রপ

নীচে এই মান দ্বারা প্রদর্শিত আচরণের ব্যাখ্যা:

  • তৈরি করুন : - স্কিমা তৈরি করুন, স্কিমায় পূর্বে উপস্থিত ডেটা (যদি সেখানে থাকে) হারিয়ে যায়
  • আপডেট: - প্রদত্ত মানগুলির সাথে স্কিমা আপডেট করুন।
  • বৈধকরণ: - স্কিমাটি বৈধ করুন। এটি ডিবিতে কোনও পরিবর্তন করে না।
  • তৈরি-ড্রপ: - পূর্বে উপস্থিত (যদি সেখানে থাকে) ডেটা ধ্বংস করে স্কিমা তৈরি করুন। সেশনফ্যাক্টরি বন্ধ হয়ে গেলে এটি ডাটাবেস স্কিমাও ফেলে দেয়।

নিম্নলিখিত গুরুত্বপূর্ণ বিষয়গুলি উল্লেখযোগ্য:

  • আপডেটের ক্ষেত্রে , স্কিমা যদি ডিবিতে উপস্থিত না থাকে তবে স্কিমা তৈরি হয়।
  • বৈধতার ক্ষেত্রে , স্কিমা যদি ডিবিতে বিদ্যমান না থাকে তবে তা তৈরি হয় না। পরিবর্তে, এটি একটি ত্রুটি ফেলবে: -Table not found:<table name>
  • তৈরি-ড্রপের ক্ষেত্রে, সেশনটি বন্ধ করার সময় স্কিমা বাদ দেওয়া হবে না। এটি কেবল সেশনফ্যাক্টরি বন্ধ করার সময় নেমে আসে।
  • যদি আমি এই সম্পত্তিটির কোনও মান দিতে পারি (উপরে আলোচনা করে উপরে চারটি মানের পরিবর্তে এপিসি বলুন) বা এটি খালি ছেড়ে দেওয়া হয়েছে। এটি নিম্নলিখিত আচরণ দেখায়:

    যদি স্কিমা ডিবিতে উপস্থিত না থাকে: - এটি স্কিমা তৈরি করে

    যদি স্কিমা ডিবিতে উপস্থিত থাকে: - স্কিমা আপডেট করুন।


এটি প্রকৃতপক্ষে একটি অত্যন্ত গুরুত্বপূর্ণ বিষয় যে স্কিমাটি উপস্থিত না থাকলে তৈরি করা হবে, যখন "আপডেট" ব্যবহার করা হবে।
yuranos

"আচরণের ব্যাখ্যা" এবং "গুরুত্বপূর্ণ পয়েন্ট" বিবৃতিগুলির সাথে তুলনা করার সময় ক্রিয়ে-ড্রপ বিপরীত হয়।
ভিএনটি

2
আপডেট এবং খালি মধ্যে পার্থক্য কি ?
yashjain12yj

46

প্রথমত, hbm2ddlকনফিগারেশন সম্পত্তিটির সম্ভাব্য মানগুলি নিম্নলিখিতগুলি:

  • none- কোন ক্রিয়া সম্পাদন করা হয় না। স্কিমা উত্পন্ন হবে না।
  • create-only - ডাটাবেস স্কিমা উত্পন্ন করা হবে।
  • drop - ডাটাবেস স্কিমা বাদ দেওয়া হবে এবং পরে তৈরি করা হবে।
  • create - ডাটাবেস স্কিমা বাদ দেওয়া হবে এবং পরে তৈরি করা হবে।
  • create-drop- ডাটাবেস স্কিমা বাদ দেওয়া হবে এবং পরে তৈরি করা হবে। সমাপ্তির পরে SessionFactory, ডাটাবেস স্কিমা বাদ দেওয়া হবে।
  • validate - সত্তা ম্যাপিং ব্যবহার করে ডাটাবেস স্কিমা বৈধ করা হবে।
  • update - বিদ্যমান ডাটাবেস স্কিমাটি সত্তা ম্যাপিংয়ের সাথে তুলনা করে ডাটাবেস স্কিমা আপডেট করা হবে।

আমি সর্বাধিক সাধারণ হাইবারনেট ডিডিএল প্রজন্মের কৌশলগুলির জন্য একটি ব্লগ পোস্ট উত্সর্গ করেছি :

  1. hibernate.hbm2ddl.auto="update"যদি আপনি ফাংশন যোগ করে অথবা কিছু কাস্টম স্ক্রিপ্ট নির্বাহ করার পরিকল্পনা সুবিধাজনক কিন্তু কম নমনীয়।
  2. সবচেয়ে নমনীয় পদ্ধতির ব্যবহার করা flyway

তবে, আপনি ফ্লাইওয়ে ব্যবহার করলেও, আপনি এখনও hbm2ddl ব্যবহার করে প্রাথমিক মাইগ্রেশন স্ক্রিপ্ট তৈরি করতে পারেন। ইন এই নিবন্ধটি , আপনি দেখতে পারেন কিভাবে আপনি jOOQ টেবিল মডেল সঙ্গে JPA সত্তা মডেল একত্রিত করতে পারেন।


27

hibernate.hbm2ddl.auto সেশনফ্যাক্টরিটি তৈরি হয়ে গেলে স্বয়ংক্রিয়ভাবে স্কিমে DDL রফতানি করে এবং রফতানি করে।

ডিফল্টরূপে এটি ডিবিতে স্বয়ংক্রিয়ভাবে কোনও সৃষ্টি বা পরিবর্তন সম্পাদন করে না। যদি ব্যবহারকারী নীচের মানগুলির একটি নির্ধারণ করে তবে এটি স্বয়ংক্রিয়ভাবে ডিডিএল স্কিমা পরিবর্তন করছে।

  • তৈরি - একটি স্কিমা তৈরি করছেন

    <entry key="hibernate.hbm2ddl.auto" value="create">
  • আপডেট - বিদ্যমান স্কিমা আপডেট করা

    <entry key="hibernate.hbm2ddl.auto" value="update">
  • বৈধতা - বিদ্যমান স্কিমা যাচাই

    <entry key="hibernate.hbm2ddl.auto" value="validate">
  • তৈরি-ড্রপ - সেশন শুরু হয়ে শেষ হয়ে গেলে স্বয়ংক্রিয়ভাবে স্কিমা তৈরি এবং ড্রপ করুন

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">

2
<এন্ট্রি কী = "হাইবারনেট.hbm2ddl.auto" মান = "কিছুই নয়"> কী?
ভিএনটি

17

আপনি যদি আপনার অ্যাপে স্ট্রিংস ব্যবহার করতে না চান এবং org.hibernate.cfg.AvailableSettingsহাইবারনেট জেআর- তে অন্তর্ভুক্ত শ্রেণীর জন্য পূর্বনির্ধারিত ধ্রুবকগুলির সন্ধান করেন , যেখানে আপনি সমস্ত সম্ভাব্য সেটিংসের জন্য একটি ধ্রুবক খুঁজে পাবেন। উদাহরণস্বরূপ আপনার ক্ষেত্রে:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
 * <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";

5
500০০+ লাইনের দীর্ঘ উত্স ফাইলের রেফারেন্সটি কেন প্রায় 500 টি ভোল আপগুলির সাথে সোজা উত্তরের উপরে দেওয়া হয়?
পাভেল নিডোবা

... এই প্রশ্নটির কোন মানে হয় না। কেন জিনিস আছে? আমি কেন এখানে আছি?
বিশেষায়িত

8
  • validate: স্কিমাটিকে বৈধতা দেয়, ডাটাবেসে কোনও পরিবর্তন ঘটে না।
  • update: বর্তমান এক্সিকিউট ক্যোয়ারী সহ স্কিমা আপডেট করে।
  • create: প্রতিবার নতুন স্কিমা তৈরি করে এবং পূর্ববর্তী ডেটা ধ্বংস করে।
  • create-drop: অ্যাপ্লিকেশন বন্ধ হয়ে গেলে বা সেশনফ্যাক্টরি স্পষ্টভাবে বন্ধ হয়ে গেলে স্কিমাটি ড্রপ করে।

'অফিসিয়াল' ডকুমেন্টেশন রেফারেন্স কী? - কেবল ভাবছি ...
ডার্ক শুমাখার

7

আমি মনে করি আপনার প্রতি মনোনিবেশ করা উচিত

SchemaExport Class 

এই শ্রেণিটি আপনার কনফিগারেশনটিকে গতিশীল করে তোলে তাই এটি আপনাকে যে কোনও স্যুটটি সর্বোত্তম চয়ন করতে দেয় ...

চেকআউট [স্কিমাএক্সপোর্ট]


4

validate: এটি স্কিমাটিকে বৈধতা দেয় এবং ডিবিতে কোনও পরিবর্তন করে না।
ধরুন আপনি ম্যাপিং ফাইলে একটি নতুন কলাম যুক্ত করেছেন এবং সন্নিবেশ অপারেশনটি সম্পাদন করেছেন, এটি ব্যাতিক্রমটি "এক্সওয়াইজেড কলাম অনুপস্থিত" নিক্ষেপ করবে কারণ আপনি যে সারণিটি সন্নিবেশ করতে যাচ্ছেন তার চেয়ে বিদ্যমান স্কিমা আলাদা। যদি আপনি সেই নতুন কলামটি ম্যানুয়ালি যোগ করে টেবিলটি পরিবর্তন করেন তবে সন্নিবেশ ক্রিয়াকলাপটি সম্পাদন করুন তবে এটি অবশ্যই অবশ্যই নতুন কলামের সাথে সমস্ত কলামটি সারণিতে সন্নিবেশ করবে। এর অর্থ এটি বিদ্যমান স্কিমা / সারণীতে কোনও পরিবর্তন / পরিবর্তন করে না।

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


3

৫.০ থেকে আপনি এখন এই মানগুলি একটি উত্সর্গীকৃত Enum: org.hibernate.boot.SchemaAutoTooling( NONE৫.২ থেকে মান সহ উন্নত ) পেতে পারেন।

বা আরও ভাল, 5.1-এর পরে , আপনি জেপিএ 2 এবং "লিগ্যাসি" হাইবারনেট ডিডিএল ক্রিয়াগুলির সংমিশ্রণটিও ব্যবহার করতে পারেন ।org.hibernate.tool.schema.Action Enum

তবে , আপনি এটি দিয়ে এখনও কোনও DataSourceপ্রোগ্রামালিফিকভাবে কনফিগার করতে পারবেন না । এটির সাথে মিলিত এটি ব্যবহার করা ভাল হবে org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTOতবে বর্তমান কোডটি একটি Stringমান আশা করে (এর থেকে নেওয়া অংশ SessionFactoryBuilderImpl):

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

... এবং অভ্যন্তরীণ enumউভয় মান org.hibernate.boot.SchemaAutoToolingএবং org.hibernate.tool.schema.Actionপ্রকাশ্যে উন্মুক্ত করা হয় না।

এখানে, একটি নমুনা প্রোগ্রাম্যাটিক DataSourceকনফিগারেশন (আমার স্প্রিং বুট অ্যাপ্লিকেশনগুলির মধ্যে ব্যবহৃত) যা গাম্বিট ধন্যবাদ ব্যবহার করে .name().toLowerCase()তবে এটি কেবল ড্যাশ ছাড়াই মানগুলির সাথে কাজ করে ( create-dropউদাহরণস্বরূপ নয়):

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {

    Map<String, Object> properties = new HashMap<>();
    properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
    properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());

    return builder
            .dataSource(internalDataSource)
            .packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
            .persistenceUnit(PERSISTENCE_UNIT_NAME)
            .properties(properties)
            .build();
}

0

ডিফল্ট মানটির জন্য কার অনুসন্ধান করে ...

এটি উত্স কোডটিতে বসন্ত-বুটের 2.0.5 সংস্করণে এবং জেপাপ্রের্টিজে 1.1.0 তে লেখা আছে:

    /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.