Hibernate: Автоматичне створення / оновлення db-таблиць на основі класів сутності


101

У мене є такий клас сутностей (у Groovy):

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 існує, але в даний час немає таблиць. Я хотів би, щоб Hibernate автоматично створював та / або оновлював таблиці на основі класів сутності. Як я це досяг?

Відповіді:


104

Я не знаю, чи має значення відхід hibernateвід фронту.

Посилання передбачає , що це повинно бутиhibernate.hbm2ddl.auto

Значення createбуде створювати ваші таблиці при створенні sessionFactory і залишати їх недоторканими.

Значення create-dropбуде створювати ваші таблиці, а потім скидати їх, коли ви закриєте сесіюFactory.

Можливо, ви повинні javax.persistence.Tableчітко встановити примітку?

Сподіваюся, це допомагає.


12
Це був зниклий "сплячий режим" на початку hbm2dll.auto. Дякую!
Jason Miesionczek

Я просто видалив цей рядок, і він не скине таблицю. Сподіваюся, це допомагає!
Meinkraft

1
як я можу зробити сплячий режим для створення таблиць, лише якщо їх не було?
Аман Нагаркоті

81

Ви можете спробувати змінити цей рядок у файлі persistent.xml

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

до:

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

Це має підтримувати схему, щоб слідкувати за будь-якими змінами, які ви вносите в Модель щоразу, коли ви запускаєте додаток.

Отримав це від JavaRanch


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>

використано базу даних H2 Wildfly


2

Є одна дуже важлива деталь, ніж це можливо може зупинити сплячку від створення таблиць (якщо припустити, що ви вже встановили hibernate.hbm2ddl.auto). Також вам знадобиться @Tableпримітка!

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

У моєму випадку це вже допомогло принаймні 3 рази - все ще не можу його згадати;)

PS. Прочитайте Hibernate документів - в більшості випадків ви , ймовірно , не хочете , щоб встановити hibernate.hbm2ddl.autoв create-drop, тому що вона видаляє ваші таблиці після зупинки програми.


0

У файлі applicationContext.xml:

<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

На підтримку відповіді @ thorinkor я б розширив свою відповідь на використання не лише @Table (name = "table_name") анотації для сутності, але й кожну дочірню змінну класу сутності слід зазначити @Column (name = "col_name"). Це призводить до безперервного оновлення таблиці на ходу.

Для тих, хто шукає сплячий конфігурацію на базі класу Java, правило застосовується і в конфігураціях на базі Java (NewHibernateUtil). Сподіваюся, це допомагає комусь іншому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.