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?

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.


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


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>

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


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.


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>

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.