Hibernate: автоматическое создание / обновление таблиц db на основе классов сущностей

У меня есть следующий класс сущности (в 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

}

и мой persistence.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 автоматически создавал и / или обновлял таблицы на основе классов сущностей. Как бы я этого добился?


person Jason Miesionczek    schedule 20.11.2008    source источник


Ответы (7)


Я не знаю, имеет ли значение оставить hibernate в стороне.

справочник предполагает, что это должно быть hibernate.hbm2ddl.auto

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

Значение create-drop создаст ваши таблицы, а затем отбросит их, когда вы закроете sessionFactory.

Возможно, вам следует явно указать аннотацию javax.persistence.Table?

Надеюсь это поможет.

person toolkit    schedule 20.11.2008
comment
Это был отсутствующий «спящий режим» в начале hbm2dll.auto. Благодарность! - person Jason Miesionczek; 21.11.2008
comment
Я только что удалил эту строку, и она не уронит стол. Надеюсь это поможет! - person sguan; 13.10.2015
comment
как я могу заставить спящий режим создавать таблицы, только если они не существуют? - person Aman Nagarkoti; 16.02.2017

Вы можете попробовать изменить эту строку в своем persistence.xml с

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

to:

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

Это должно поддерживать схему, чтобы отслеживать любые изменения, которые вы вносите в Модель при каждом запуске приложения.

Получил это с JavaRanch

person billjamesdev    schedule 20.11.2008

Иногда, в зависимости от того, как задана конфигурация, длинная и краткая формы тега свойства также могут иметь значение.

например если у вас это вроде:

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

попробуйте изменить его на:

<property name="hibernate.hbm2ddl.auto">create</property>
person Harbir    schedule 29.05.2013

В моем случае таблица не создавалась впервые без последнего свойства, указанного ниже:

<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

person DevDio    schedule 10.12.2017

Есть одна очень важная деталь, которая может помешать вашей гибернации генерировать таблицы (при условии, что вы уже установили hibernate.hbm2ddl.auto). Вам также понадобится аннотация @Table!

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

В моем случае это уже помогло как минимум 3 раза - до сих пор не могу вспомнить;)

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

person thorinkor    schedule 19.05.2016

В файле 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>
person Yusuf Aksun    schedule 15.04.2017

В поддержку ответа @thorinkor я бы расширил свой ответ, чтобы использовать не только аннотацию @Table (name = "table_name") для объекта, но также каждую дочернюю переменную класса объекта следует аннотировать с помощью @Column (name = "col_name"). Это приводит к плавному обновлению таблицы на ходу.

Для тех, кто ищет конфигурацию гибернации на основе классов Java, правило применяется также в конфигурациях на основе Java (NewHibernateUtil). Надеюсь, это поможет кому-то другому.

person AbsoluteDev    schedule 18.09.2019