হাইবারনেট: সত্তা শ্রেণীর উপর ভিত্তি করে ডিবি টেবিলগুলি স্বয়ংক্রিয়ভাবে তৈরি / আপডেট করা


101

আমার নিম্নোক্ত সত্তা শ্রেণি রয়েছে (গ্রোভিতে):

import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType

@Entity
public class ServerNode {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  Long id

  String firstName
  String lastName

}

এবং আমার অধ্যবসায়ী। xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="NewPersistenceUnit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/Icarus"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value=""/>
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hbm2ddl.auto" value="create"/>
        </properties>
        <class>net.interaxia.icarus.data.models.ServerNode</class>
    </persistence-unit>
</persistence>

এবং লিপি:

import javax.persistence.EntityManager
import javax.persistence.EntityManagerFactory
import javax.persistence.Persistence
import net.interaxia.icarus.data.models.ServerNode

def factory = Persistence.createEntityManagerFactory("NewPersistenceUnit")
def manager = factory.createEntityManager()

manager.getTransaction().begin()

manager.persist new ServerNode(firstName: "Test", lastName: "Server")

manager.getTransaction().commit()

Icarus ডাটাবেস বিদ্যমান, কিন্তু বর্তমানে কোন টেবিল নেই। আমি চাইছি হাইবারনেট সত্তা শ্রেণীর উপর ভিত্তি করে সারণিগুলি স্বয়ংক্রিয়ভাবে তৈরি করতে এবং / অথবা আপডেট করে। আমি কীভাবে এটি সম্পাদন করব?

উত্তর:


104

আমি জানি না hibernateসামনের দিকে ছেড়ে দিলে কোনও তফাত হয়।

রেফারেন্স প্রস্তাব দেওয়া এটি হওয়া উচিতhibernate.hbm2ddl.auto

একটি মান createসেশন কারখানা তৈরিতে আপনার টেবিল তৈরি করবে এবং এগুলি অক্ষত রেখে দেবে।

এর মানটি create-dropআপনার টেবিলগুলি তৈরি করবে এবং আপনি সেশন কারখানাটি বন্ধ করার পরে এগুলি ফেলে দিন drop

সম্ভবত আপনি javax.persistence.Tableস্পষ্টভাবে টীকা সেট করা উচিত ?

আশাকরি এটা সাহায্য করবে.


12
এটি hbm2dll.auto এর শুরুতে নিখোঁজ 'হাইবারনেট' ছিল। ধন্যবাদ!
জেসন মিজিয়নসেকজ

আমি এই লাইনটি সরিয়েছি এবং এটি টেবিলটি ফেলে দেবে না। আশাকরি এটা সাহায্য করবে!
endmymissouri

4
টেবিলগুলি তৈরি না করে কেবল কীভাবে হাইবারনেট করব?
আমান নগরকোটি

81

আপনি আপনার অধ্যবসায়.এক্সএমএল থেকে এই লাইনটি পরিবর্তন করার চেষ্টা করতে পারেন

<property name="hbm2ddl.auto" value="create"/>

প্রতি:

<property name="hibernate.hbm2ddl.auto" value="update"/>

প্রতিবার অ্যাপ্লিকেশন চালানোর সময় আপনি মডেলটিতে যে কোনও পরিবর্তন আনতে এটি স্কিমা বজায় রাখার কথা।

এটি জাভাআরঞ্চ থেকে পেয়েছি


10

কখনও কখনও কনফিগারেশন কীভাবে সেট করা হয় তার উপর নির্ভর করে লম্বা ফর্ম এবং সম্পত্তি ট্যাগের সংক্ষিপ্ত রূপটিও পার্থক্য আনতে পারে।

উদাহরণস্বরূপ যদি আপনার এটির মতো থাকে:

<property name="hibernate.hbm2ddl.auto" value="create"/>

এটিকে পরিবর্তন করার চেষ্টা করুন:

<property name="hibernate.hbm2ddl.auto">create</property>

6

নীচে তালিকাভুক্ত সর্বশেষ সম্পত্তি ছাড়া আমার ক্ষেত্রে সারণী প্রথমবার তৈরি করা হয়নি:

<properties>
    <property name="hibernate.archive.autodetection" value="class"/>
    <property name="hibernate.show_sql" value="true"/>
    <property name="hibernate.format_sql" value="true"/>
    <property name="hbm2ddl.auto" value="create-drop"/>
    <!-- without below table was not created -->
    <property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
</properties>

ওয়াইল্ডফ্লাইয়ের ইন-মেমরি এইচ 2 ডাটাবেস ব্যবহৃত হয়েছে


2

এখানে একটি অত্যন্ত গুরুত্বপূর্ণ বিশদ রয়েছে, সম্ভবত আপনার হাইবারনেটটি টেবিল তৈরি করা থেকে বিরত থাকতে পারে (ধরে নিবেন আপনি ইতিমধ্যে সেট করে ফেলেছেন hibernate.hbm2ddl.auto)। আপনার @Tableএনেটেশনও লাগবে !

@Entity
@Table(name = "test_entity")
    public class TestEntity {
}

এটি ইতিমধ্যে আমার ক্ষেত্রে কমপক্ষে 3 বার সহায়তা করেছে - এখনও এটি মনে করতে পারে না;)

পুনশ্চ. হাইবারনেট ডক্স পড়ুন - বেশিরভাগ ক্ষেত্রে আপনি সম্ভবত সেট hibernate.hbm2ddl.autoকরতে চান না create-drop, কারণ এটি অ্যাপটি বন্ধ করার পরে এটি আপনার টেবিলগুলি মুছে দেয়।


0

অ্যাপ্লিকেশন কনটেক্সট.এক্সএমএল ফাইলটিতে:

<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <!-- This makes /META-INF/persistence.xml is no longer necessary -->
      <property name="packagesToScan" value="com.howtodoinjava.demo.model" />
      <!-- JpaVendorAdapter implementation for Hibernate EntityManager.
           Exposes Hibernate's persistence provider and EntityManager extension interface -->
      <property name="jpaVendorAdapter">
         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
      </property>
      <property name="jpaProperties">
         <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
         </props>
      </property>
   </bean>

0

@ থোরিঙ্করের উত্তরের সমর্থনে আমি আমার উত্তরটি কেবলমাত্র সত্ত্বার জন্য @ টেবিল (নাম = "টেবিল_নাম") টীকাটি ব্যবহার করার জন্য প্রসারিত করব না, তবে সত্তা শ্রেণীর প্রতিটি শিশু ভেরিয়েবলকেও @ কলম (নাম = "কল_নাম") দিয়ে টীকাযুক্ত করা উচিত। চলতে চলার টেবিলটিতে নির্বিঘ্ন আপডেটে এর ফলস্বরূপ।

যারা জাভা ক্লাস ভিত্তিক হাইবারনেট কনফিগারেশনের সন্ধান করছেন তাদের জন্য এই নিয়মটি জাভা ভিত্তিক কনফিগারেশনেও প্রয়োগ করা হয় (নিউহাইবারনেট ইউটিল)। আশা করি এটি অন্য কাউকে সাহায্য করবে।

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