wake-up-neo.com

Der Ruhezustand erstellt nicht automatisch eine Tabelle, die nicht in der Datenbank vorhanden ist

Ich habe einen grundlegenden Hibernate-Code, Ich habe die Eigenschaft "hibernate.hbm2ddl.auto" als Aktualisierung festgelegt. Dennoch wird die Tabelle in der Datenbank nicht automatisch erstellt. 

Dies sind die erforderlichen Dateien:

employee.hbm.xml

<hibernate-mapping>
  <class name="contacts.employee" table="contacts">
      <meta attribute="class-description"></meta>
    <id column="contactId" name="contactId" type="string">
      <generator class="assigned"/>
    </id>
    <property column="contactName" length="100" name="contactName" not-null="true" type="string"/>
    <property column="password" length="100" name="password" not-null="true" type="string"/>
    <set cascade="all" name="groupOfResponsibilities" table="employee_responsibilty">
      <key column="contactId"/>
      <many-to-many class="contacts.responsibilities" column="responsibilityId"/>

    </set>

  </class>
</hibernate-mapping>

verantwortung.hbm.xml

<hibernate-mapping>
  <class name="contacts.responsibilities" table="responsibilities">
    <meta attribute="class-description">
        This class list of responsibilities if an employee
    </meta>
    <id column="responsibilityId" name="responsibilityId" type="long">
      <generator class="increment"/>
    </id>
    <property column="responsibilityName" name="responsibilityName" type="string"/>
  </class>
</hibernate-mapping>

hibernate.cfg.xml

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/****</property>
    <property name="hibernate.connection.username">*****</property>
    <property name="hibernate.connection.password">*****</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.show_sql">true</property>
    <mapping resource="contacts/employee.hbm.xml"/>
    <mapping resource="contacts/responsibilitiy.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Dies ist der Main.Java, den ich ausführen möchte:

public class Main {

    public static void main(String[] args) {

        SessionFactory sessionfactory = NewHibernateUtil.getSessionFactory();
        Transaction transaction = null;
        try {
            Session session = sessionfactory.openSession();
            transaction = session.beginTransaction();
            Set<responsibilities> groups = new HashSet<responsibilities>();
            responsibilities responsibilityOne=new responsibilities("Java");
            responsibilities responsibilityTwo=new responsibilities("SQL");
            responsibilities responsibilityThree=new responsibilities("Oracle");
            groups.add(responsibilityOne);
            groups.add(responsibilityTwo);
            groups.add(responsibilityThree);
            String uuid = UUID.randomUUID().toString();
            String uuid2 = UUID.randomUUID().toString();
            employee firstEmployee;
            firstEmployee = new employee(uuid, "Mike", groups);
            employee secondEmployee = new employee(uuid2, "Marc", groups);
            session.save(responsibilityOne);
            session.save(responsibilityTwo);
            session.save(responsibilityThree);
            session.save(firstEmployee);
            session.save(secondEmployee);

            transaction.commit();
        } catch (HibernateException e) {
            transaction.rollback();
            e.printStackTrace();
        } finally {

        }

    }
}

Dies ist der Fehler, den ich bekomme:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Tabelle ' * *. Verantwortlichkeiten' ist nicht vorhanden

18
Nick Div

Ich hatte das gleiche Problem, das funktionierte für mich - 

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

Das folgende Szenario kann ein weiterer Grund dafür sein, dass Hibernate Ihre Tabelle nicht automatisch erstellen kann:

@Entity
public class Employee {
  @Id
  @GeneratedValue
  private String empID;
  private String name;
}   

Die Tabelle Employee wird von Hibernate nicht automatisch erstellt, da empID eine String ist und die Annotation @GeneratedValue hat. empID sollte eine int oder long sein. Ich hatte dieses Problem irgendwann und änderte mein id-Feld, das die @GeneratedValue-Annotation hatte, in den Typ int. Hibernate erstellte die Tabelle automatisch.

11
Kihats

Ich hatte das gleiche Problem, ich habe es durch Ändern gelöst:

org.hibernate.dialect.MySQLInnoDBDialect

zu

org.hibernate.dialect.MySQLDialect

Ich habe die Lösung in diese Frage gefunden.

9
Carloso
  1. Überprüfen Sie zunächst Ihre MySQL-Version mit $mysql --version $mysql Ver 14.14 Distrib 5.5.11.

Dann ändern Sie den Dialekt entsprechend 

  1. dann ändern Sie die Dialekt-Eigenschaft/Für dieses Beispiel habe ich MySQL55Dialect/ org.hibernate.dialect.MySQL55Dialect angegeben

////////////////////////////////////////// wo Sie Dialekt finden können: 

org.hibernate.dialect
try 
import org.hibernate.dialect.ctrl+space
you find option

Ich hoffe das hilft

1
Dipayan Das

Warum versuchst du nicht stattdessen create oder create-drop? Scheint Ihren Zweck zu erfüllen . http://docs.jboss.org/hibernate/core/3.3/reference/de/html/session-configuration.html#configuration-optional

1
urug

Machen Sie einfach die richtige Konfiguration

1) Erstellen, jedes Mal, wenn eine neue Tabelle erstellt wird. Alle alten Daten werden gelöscht.

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

2) Update: Wenn eine Änderung vorgenommen wurde, gilt dies auch für die DB.

<property name="hibernate.hbm2ddl.auto">update</property>
0
Angad Bansode

Für die vorhandene Arbeitsumgebung oder für große Anwendungsbereiche wird es nicht empfohlen, hibernate.hbm2ddl.autoon create oder create-drop festzulegen (siehe unten)

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

es funktioniert zwar, aber es werden bei jedem Neustart des Servers alle vorhandenen Tabellen der Datenbank gelöscht.

Wenn Sie die hibernate jar-Version 5.2.0 verwenden, wechseln Sie bitte zu einer niedrigeren oder einer anderen Version. Diese Version jar hat Probleme mit dem Update.

Es hat für mich funktioniert und ich hoffe, dass es auch für andere funktionieren wird.

0
Prakhar Agrawal

Ich hatte das gleiche Problem, aber für mich war die Lösung: 

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

anstatt

<property name="hibernate.hbm2ddl">create-drop</property>
0
Cristi B.

Der Ruhezustand kann eine Tabelle, eine Ruhezustandsequenz und Tabellen erstellen, die für das Many-to-Many-Mapping in Ihrem Namen verwendet werden. Sie müssen sie jedoch explizit konfigurieren, indem Sie setProperty ("hibernate.hbm2ddl.auto", "create") des Konfigurationsobjekts aufrufen. Standardmäßig wird das Schema nur mit der DB überprüft und es wird ein Fehler ausgeführt, wenn noch nichts vorhanden ist, indem der Fehler "ORA-00942: Tabelle oder Sicht nicht vorhanden" ausgegeben wird. 

0
Ashish Sharma