Ruhezustand: Automatisches Erstellen / Aktualisieren der DB-Tabellen basierend auf Entitätsklassen

101

Ich habe die folgende Entitätsklasse (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

}

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

und das Skript:

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

Die Datenbank Icarus existiert, hat aber derzeit keine Tabellen. Ich möchte, dass Hibernate die Tabellen basierend auf den Entitätsklassen automatisch erstellt und / oder aktualisiert. Wie würde ich das erreichen?

Jason Miesionczek
quelle

Antworten:

104

Ich weiß nicht, ob hibernatees einen Unterschied macht, die Front wegzulassen.

Die Referenz schlägt vor, dass es sein solltehibernate.hbm2ddl.auto

Ein Wert von createerstellt Ihre Tabellen bei der Erstellung von sessionFactory und lässt sie intakt.

Ein Wert von create-droperstellt Ihre Tabellen und löscht sie dann, wenn Sie die sessionFactory schließen.

Vielleicht sollten Sie die javax.persistence.TableAnmerkung explizit festlegen ?

Hoffe das hilft.

Toolkit
quelle
12
Es war der fehlende Ruhezustand am Anfang von hbm2dll.auto. Vielen Dank!
Jason Miesionczek
Ich habe gerade diese Zeile entfernt und sie lässt die Tabelle nicht fallen. Hoffe das hilft!
Meinkraft
1
Wie kann ich den Ruhezustand aktivieren, um Tabellen nur dann zu erstellen, wenn sie nicht vorhanden sind?
Aman Nagarkoti
81

Sie können versuchen, diese Zeile in Ihrer persistence.xml von zu ändern

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

zu:

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

Dadurch soll das Schema beibehalten werden, damit alle Änderungen, die Sie am Modell vornehmen, bei jeder Ausführung der App berücksichtigt werden.

Habe das von JavaRanch bekommen

billjamesdev
quelle
10

Abhängig von der Einstellung der Konfiguration können manchmal auch die Langform und die Kurzform des Eigenschaftstags den Unterschied ausmachen.

zB wenn du es magst wie:

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

Versuchen Sie es zu ändern in:

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

In meinem Fall wurde die Tabelle nicht zum ersten Mal ohne die unten aufgeführte letzte Eigenschaft erstellt:

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

verwendete Wildflys In-Memory-H2-Datenbank

DevDio
quelle
2

Es gibt ein sehr wichtiges Detail, das möglicherweise verhindern kann, dass Ihr Ruhezustand Tabellen generiert (vorausgesetzt, Sie haben die bereits festgelegt hibernate.hbm2ddl.auto). Sie benötigen auch die @TableAnmerkung!

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

Es hat in meinem Fall schon mindestens 3 mal geholfen - kann mich immer noch nicht daran erinnern;)

PS. Lesen Sie die Hibernate - docs - in den meisten Fällen werden Sie wahrscheinlich nicht festlegen möchten hibernate.hbm2ddl.autozu create-drop, weil es Ihre Tabellen löscht , nachdem die App zu stoppen.

Thorinkor
quelle
0

In der Datei 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>
Yusuf Aksun
quelle
0

Zur Unterstützung der Antwort von @ thorinkor würde ich meine Antwort erweitern, um nicht nur die Annotation @Table (name = "table_name") für die Entität zu verwenden, sondern auch jede untergeordnete Variable der Entitätsklasse mit @Column (name = "col_name") zu kommentieren. Dies führt zu einer nahtlosen Aktualisierung der Tabelle unterwegs.

Für diejenigen, die nach einer Java-Klassen-basierten Ruhezustandskonfiguration suchen, gilt die Regel auch in Java-basierten Konfigurationen (NewHibernateUtil). Hoffe es hilft jemand anderem.

AbsoluteDev
quelle