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 автоматически создавал и/или обновлял таблицы на основе классов сущностей. Как бы я это сделал?
Ответы
Ответ 1
Я не знаю, имеет ли выход hibernate
с передней стороны разницу.
reference предполагает, что это должно быть hibernate.hbm2ddl.auto
Значение create
создаст ваши таблицы при создании sessionFactory и оставьте их неповрежденными.
Значение create-drop
создаст ваши таблицы, а затем опустит их, когда вы закроете sessionFactory.
Возможно, вы должны явно указать аннотацию javax.persistence.Table
?
Надеюсь, что это поможет.
Ответ 2
Вы можете попробовать изменить эту строку в файле persistence.xml из
<property name="hbm2ddl.auto" value="create"/>
в
<property name="hibernate.hbm2ddl.auto" value="update"/>
Предполагается, что схема должна следовать за любыми изменениями, внесенными вами в Модель при каждом запуске приложения.
Получите это от JavaRanch
Ответ 3
Иногда в зависимости от настройки конфигурации длинная форма и короткая форма тега свойств также могут иметь значение.
например. если у вас есть это:
<property name="hibernate.hbm2ddl.auto" value="create"/>
попробуйте изменить его на:
<property name="hibernate.hbm2ddl.auto">create</property>
Ответ 4
Есть одна очень важная деталь, которая может остановить ваш спящий режим от создания таблиц (если вы уже установили hibernate.hbm2ddl.auto
). Вам также понадобится аннотация @Table
!
@Entity
@Table(name = "test_entity")
public class TestEntity {
}
Это уже помогло мне в моем случае по крайней мере 3 раза - все еще не помню его;)
PS. Прочитайте документы hibernate - в большинстве случаев вы, вероятно, не захотите установить hibernate.hbm2ddl.auto
на create-drop
, потому что он удаляет ваши таблицы после остановки приложения.
Ответ 5
В моем случае таблица не была создана в первый раз без последнего свойства, указанного ниже:
<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>
используется база данных Wildfly in-memory H2
Ответ 6
В файле 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 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>
Ответ 7
В поддержку ответа @thorinkor я бы расширил свой ответ, чтобы использовать не только аннотацию @Table (name = "table_name") для сущности, но и каждую дочернюю переменную класса сущности должна быть аннотирована @Column (name = "col_name"). Это приводит к плавному обновлению таблицы на ходу.
Для тех, кто ищет конфигурацию гибернации на основе классов Java, правило применяется также в конфигурациях на основе Java (NewHibernateUtil). Надеюсь, это поможет кому-то еще.
Ответ 8
Hibernate hbm2ddl.auto:
Автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory. С помощью create-drop схема базы данных будет удалена, если SessionFactory будет закрыта явно.
например Проверить | обновление | создать | создать падение
Подробнее см. ссылку .