Hibernate: creazione / aggiornamento automatico delle tabelle db in base alle classi di entità


101

Ho la seguente classe di entità (in 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

}

e il mio 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>

e lo script:

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()

il database Icarus esiste, ma attualmente non ha tabelle. Vorrei che Hibernate crei e / o aggiorni automaticamente le tabelle in base alle classi di entità. Come potrei farlo?

Risposte:


104

Non so se lasciare hibernateil fronte fa la differenza.

Il riferimento suggerisce che dovrebbe esserehibernate.hbm2ddl.auto

Un valore di createcreerà le tue tabelle durante la creazione di sessionFactory e le lascerà intatte.

Un valore di create-dropcreerà le tue tabelle, quindi le rilascia quando chiudi sessionFactory.

Forse dovresti impostare l' javax.persistence.Tableannotazione in modo esplicito?

Spero che questo ti aiuti.


12
Era l '"ibernazione" mancante all'inizio di hbm2dll.auto. Grazie!
Jason Miesionczek

Ho appena rimosso quella riga e non lascerà cadere la tabella. Spero che questo ti aiuti!
Meinkraft

1
come posso rendere ibernato per creare tabelle solo se non esistono?
Aman Nagarkoti,

81

Potresti provare a cambiare questa riga nel tuo persistence.xml da

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

per:

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

Questo dovrebbe mantenere lo schema per seguire le modifiche apportate al modello ogni volta che esegui l'app.

Ottenuto da JavaRanch


10

A volte, a seconda di come è impostata la configurazione, anche la forma lunga e la forma abbreviata del tag della proprietà possono fare la differenza.

ad esempio, se ce l'hai come:

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

prova a cambiarlo in:

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

6

Nel mio caso la tabella non è stata creata per la prima volta senza l'ultima proprietà elencata di seguito:

<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>

ha utilizzato il database H2 in memoria di Wildfly


2

C'è un dettaglio molto importante, che può eventualmente impedire alla tua ibernazione di generare tabelle (supponendo che tu abbia già impostato il hibernate.hbm2ddl.auto). Avrai anche bisogno @Tabledell'annotazione!

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

Ha già aiutato nel mio caso almeno 3 volte - ancora non riesco a ricordarlo;)

PS. Leggere la documentazione Hibernate - nella maggior parte dei casi Probabilmente non si desidera impostare hibernate.hbm2ddl.autoa create-drop, perché elimina Le tabelle dopo l'arresto l'applicazione.


0

Nel file 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

A sostegno della risposta di @ thorinkor estenderei la mia risposta per utilizzare non solo l'annotazione @Table (name = "table_name") per l'entità, ma anche ogni variabile figlia della classe di entità dovrebbe essere annotata con @Column (name = "col_name"). Ciò si traduce in un aggiornamento senza interruzioni del tavolo in movimento.

Per coloro che sono alla ricerca di una configurazione di ibernazione basata su classi Java, la regola si applica anche alle configurazioni basate su java (NewHibernateUtil). Spero che aiuti qualcun altro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.