2008-11-20 11 views
85

Ich habe folgende Entity-Klasse (in Groovy):Hibernate: Automatische Erstellung/Aktualisierung der DB-Tabellen basierend auf Entitätsklassen

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 zur Zeit 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?

Antwort

87

Ich weiß nicht, ob hibernate aus der Front verlassen einen Unterschied macht.

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

Ein Wert von create Ihre Tabellen bei session Schöpfung schaffen, und sie intakt lassen.

Ein Wert von create-drop wird Ihre Tabellen erstellen und sie dann löschen, wenn Sie die sessionFactory schließen.

Vielleicht sollten Sie die javax.persistence.Table Annotation explizit festlegen?

Hoffe, das hilft.

+9

Es war der fehlende "Winterschlaf" am Anfang des hbm2dll.auto. Vielen Dank! –

+0

Ich habe gerade diese Zeile entfernt und es wird die Tabelle nicht fallen lassen. Hoffe das hilft! – Meinkraft

+0

Wie kann ich Hibernate machen, um Tabellen nur zu erstellen, wenn sie nicht existierten? –

72

Sie können diese Zeile in Ihrer persistence.xml von

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

, um versuchen zu ändern:

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

Dieses soll das Schema halten alle Änderungen folgen machen Sie zum Modell jedes Mal Sie führen die App aus.

Dieses erhielt von JavaRanch

8

Abhängig von der Konfiguration der Konfiguration können die lange Form und die Kurzform des Eigenschaftskennzeichens manchmal auch den Unterschied ausmachen.

z.B. wenn Sie es haben mag:

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

try Ändern Sie es an:

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

Hibernate hbm2ddl.auto:

automatisch validiert oder Exporte Schema DDL in die Datenbank, wenn die Session erstellt . Mit create-drop wird das Datenbankschema gelöscht, wenn die SessionFactory explizit geschlossen wird. z.B. validieren | aktualisieren | erstellen | create-drop

Bitte überprüfen Sie die link für weitere Details.

+1

Dieser Link ist veraltet/defekt –

0

Es gibt ein sehr wichtiges Detail, das Ihren Ruhezustand möglicherweise daran hindern kann, Tabellen zu generieren (vorausgesetzt, Sie haben bereits hibernate.hbm2ddl.auto eingestellt).Sie werden auch die @Table Annotation benötigen!

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

Es hat sich bereits in meinem Fall mindestens 3-mal geholfen - es kann immer noch nicht erinnern;)

PS. Lesen Sie die Hibernate-Dokumentation - in den meisten Fällen möchten Sie hibernate.hbm2ddl.auto nicht auf create-drop setzen, da Ihre Tabellen nach dem Beenden der App gelöscht werden.

0

In applicationContext.xml Datei:

<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

In meinem Fall Tabelle nicht zum ersten Mal ohne letzte Eigenschaft erstellt wurde nachfolgend aufgeführt:

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

verwendet Wildfly des In-Memory-Datenbank H2

Verwandte Themen