J'ai un code de base d'Hibernate, J'ai défini la propriété "hibernate.hbm2ddl.auto" comme mise à jour mais la création de la table dans la base de données n'est pas automatique.
Ce sont les fichiers requis:
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>
responsabilité.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>
Voici le Main.Java que j'essaie de lancer:
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 {
}
}
}
C'est l'erreur que je reçois:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: la table ' * *.' n'existe pas
J'ai eu le même problème, cela a fonctionné pour moi -
<property name="hibernate.hbm2ddl.auto">create</property>
Le scénario suivant pourrait être une autre raison pour laquelle Hibernate ne peut pas créer automatiquement votre table:
@Entity
public class Employee {
@Id
@GeneratedValue
private String empID;
private String name;
}
La table Employee
ne sera pas créée automatiquement par Hibernate puisque empID
est une String
et qu'elle comporte l'annotation @GeneratedValue
. empID
devrait être int
ou long
. J'ai eu ce problème à un moment donné et j'ai changé mon champ id
qui avait l'annotation @GeneratedValue
en étant de type int
et Hibernate a créé automatiquement la table.
J'ai eu le même problème, je l'ai résolu en changeant:
org.hibernate.dialect.MySQLInnoDBDialect
à
org.hibernate.dialect.MySQLDialect
J'ai trouvé la solution dans cette question .
$mysql --version $mysql Ver 14.14 Distrib 5.5.11
Puis changez le dialecte en conséquence
MySQL55Dialect/ org.hibernate.dialect.MySQL55Dialect
////////////////////////////////////////////////////// - où trouver le dialecte:
org.hibernate.dialect
try
import org.hibernate.dialect.ctrl+space
you find option
J'espère que cette aide
Pourquoi n'essaies-tu pas de créer ou de créer-déposer à la place? Semble servir votre objectif . http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-optional
Il suffit de faire une configuration correcte
1) Créer, chaque fois qu'une nouvelle table va créer. Toutes les anciennes données seront supprimées.
<property name="hibernate.hbm2ddl.auto">create</property>
2) Mise à jour, si une modification est apportée, cela sera répercuté sur la base de données.
<property name="hibernate.hbm2ddl.auto">update</property>
Pour l'environnement de travail existant, ou pour tout grand domaine d'application, il n'est pas recommandé de définir hibernate.hbm2ddl.autoon create ou create-drop , comme indiqué ci-dessous
<property name="hibernate.hbm2ddl.auto">create-drop</property>
bien que cela fonctionne, mais il supprimera toutes les tables existantes de la base de données chaque fois que vous redémarrez le serveur.
Si vous utilisez le fichier jar hibernate version 5.2.0 , veuillez basculer vers une version inférieure ou une autre version. Ce fichier jar rencontre un problème de mise à jour.
Cela a fonctionné pour moi et j'espère que cela fonctionnera aussi pour les autres.
J'ai eu le même problème, mais pour moi la solution était:
<property name="hibernate.hbm2ddl.auto">create-drop</property>
au lieu de
<property name="hibernate.hbm2ddl">create-drop</property>
Hibernate peut créer une table, une séquence hibernate et des tables utilisées pour le mappage plusieurs à plusieurs en votre nom, mais vous devez la configurer explicitement en appelant setProperty ("hibernate.hbm2ddl.auto", "create") de l'objet Configuration. Par défaut, il ne fait que valider le schéma avec une base de données et échoue si quelque chose n'existe pas déjà en générant l'erreur "ORA-00942: la table ou la vue n'existe pas".