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
Ich hatte das gleiche Problem, das funktionierte für mich -
<property name="hibernate.hbm2ddl.auto">create</property>
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.
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.
$mysql --version $mysql Ver 14.14 Distrib 5.5.11
.Dann ändern Sie den Dialekt entsprechend
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
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
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>
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.
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>
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.