Спящий режим: автоматическое создание/обновление таблиц БД на основе классов сущностей
у меня есть следующий класс сущности (в 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()
базы данных Икара существует, но в настоящее время не имеет таблиц. Я хотел бы, чтобы Hibernate автоматически создавал и/или обновлял таблицы на основе классов сущностей. Как бы мне это сделать?
7 ответов:
Я не знаю, если оставление
hibernate
от фронта имеет значение.The ссылка предполагает, что это должно быть
hibernate.hbm2ddl.auto
значение
create
создаст ваши таблицы при создании sessionFactory и оставит их нетронутыми.значение
create-drop
создаст ваши таблицы, а затем отбросит их, когда вы закроете sessionFactory.возможно, вы должны установить
javax.persistence.Table
аннотации явно?Надежда эта помощь.
Вы можете попробовать изменить эту строку в вашей настойчивости.xml от
<property name="hbm2ddl.auto" value="create"/>
to:
<property name="hibernate.hbm2ddl.auto" value="update"/>
это должно поддерживать схему, чтобы следовать за любыми изменениями, которые вы вносите в модель каждый раз при запуске приложения.
получил от JavaRanch
иногда в зависимости от того, как задана конфигурация, длинная форма и короткая форма тега свойства также могут иметь значение.
например, если у вас это так:
<property name="hibernate.hbm2ddl.auto" value="create"/>
попробуйте изменить его на:
<property name="hibernate.hbm2ddl.auto">create</property>
в моем случае таблица не была создана в первый раз без последнего свойства, указанного ниже:
<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 в памяти H2
есть одна очень важная деталь, чем можно остановить ваш спящий режим от генерации таблиц (предполагая, что вы уже установили
hibernate.hbm2ddl.auto
). Вам также понадобится@Table
аннотации!@Entity @Table(name = "test_entity") public class TestEntity { }
это уже помогло в моем случае, по крайней мере, 3 раза - до сих пор не могу вспомнить его ;)
PS. Прочитайте документы hibernate - в большинстве случаев вы, вероятно, не захотите устанавливать
hibernate.hbm2ddl.auto
tocreate-drop
, потому что он удаляет ваши таблицы после остановки приложения.
в 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>
Hibernate hbm2ddl.авто:
автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory. С помощью команды create-drop схема базы данных будет удалена при явном закрытии объекта SessionFactory. например, проверить | обновить | создать | создавать капли
пожалуйста, проверьте ссылке для более подробной информации.