it-swarm.com.de

Ruhezustand: Automatische Erstellung / Aktualisierung der DB-Tabellen basierend auf Entitätsklassen

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

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?

95

Ich weiß nicht, ob es einen Unterschied macht, hibernate von der Vorderseite wegzulassen.

Die Referenz schlägt vor, es sollte sein hibernate.hbm2ddl.auto

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

Mit dem Wert create-drop Werden Ihre Tabellen erstellt und beim Schließen der sessionFactory gelöscht.

Vielleicht solltest du die javax.persistence.Table Annotation explizit setzen?

Hoffe das hilft.

97
toolkit

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

Damit soll das Schema beibehalten werden, damit Änderungen, die Sie bei jedem Ausführen der App am Modell vornehmen, berücksichtigt werden.

Habe dies von JavaRanch

75
billjamesdev

Abhängig von der Konfiguration können manchmal auch die lange und die kurze Form des Property-Tags den Unterschied ausmachen.

z.B. wenn du es magst:

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

versuchen Sie es zu ändern:

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

In meinem Fall wurde die Tabelle nicht zum ersten Mal ohne die zuletzt aufgeführte 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 speicherinterne H2-Datenbank

1
DevDio

Es gibt ein sehr wichtiges Detail, das Ihren Ruhezustand möglicherweise davon abhalten kann, Tabellen zu generieren (vorausgesetzt, Sie haben bereits den hibernate.hbm2ddl.auto - Wert festgelegt). Sie benötigen außerdem die Annotation @Table!

@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 Dokumente zum Ruhezustand - in den meisten Fällen möchten Sie wahrscheinlich nicht hibernate.hbm2ddl.auto Auf create-drop Setzen, da Ihre Tabellen nach dem Beenden der App gelöscht werden.

0
thorinkor

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