java - Hbm2ddl.auto সম্ভাব্য মান এবং তারা কি কি হাইবারনেট?




hibernate (9)

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

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

  • নতুন টেবিল
  • পুরাতন টেবিলে নতুন কলাম
  • কলাম মুছে ফেলা হয়েছে
  • একটি কলামের ডাটা টাইপ পরিবর্তন
  • একটি কলামের একটি ধরন তার গুণাবলী পরিবর্তন
  • টেবিল বাদ পড়েছে
  • একটি কলাম মান পরিবর্তন

প্রতিটি ক্ষেত্রে সেরা সমাধান কি?


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

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


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

/**
 * 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";

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


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

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

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


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

hibernate.hbm2ddl.auto

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

তৈরি | আপডেট | যাচাই করুন | তৈরি ড্রপ

নিম্নলিখিত মান দ্বারা দেখানো আচরণ ব্যাখ্যা নিম্নলিখিত:

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

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

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

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

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


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


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

hibernate.hbm2ddl.auto SessionFactory তৈরি হওয়ার পরে স্বয়ংক্রিয়ভাবে ডেটাবেসকে স্কিমা DDL যাচাই বা রপ্তানি করে। তৈরি-ড্রপ সহ, সেশন ফ্যাক্টরী স্পষ্টভাবে বন্ধ থাকলে ডাটাবেস স্কিমাটি বাদ দেওয়া হবে।

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

সুতরাং সম্ভাব্য বিকল্প তালিকা,

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

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


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">

5.0 থেকে , আপনি এখন এই মানগুলি একটি নিবেদিত Enum : org.hibernate.boot.SchemaAutoTooling এ খুঁজে পেতে পারেন (5.2 থেকে NONE মান সহ বর্ধিত)।

অথবা 5.1 এর চেয়েও ভাল, আপনি org.hibernate.tool.schema.Action Enum ব্যবহার করতে পারেন যা JPA 2 এবং "legacy" হাইবারনেট DDL ক্রিয়াগুলিকে একত্রিত করে।

কিন্তু , আপনি এখনও এই সঙ্গে প্রোগ্রাম্যাটিকভাবে একটি DataSource কনফিগার করতে পারবেন না। এটি org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO সাথে মিলিত করার জন্য এটি org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO তবে বর্তমান কোডটি String মান ( org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO থেকে নেওয়া উদ্ধৃতি) প্রত্যাশা করে:

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

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

এখানে, একটি নমুনা প্রোগ্রাম্যাটিক DataSource কনফিগারেশন (আমার স্প্রিং বুট অ্যাপ্লিকেশনের .name().toLowerCase() ব্যবহৃত) যা একটি .name().toLowerCase() ধন্যবাদ .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();
}




hbm2ddl