web-dev-qa-db-fra.com

Hibernate ne crée pas automatiquement une table qui n'existe pas dans la base de données

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

18
Nick Div

J'ai eu le même problème, cela a fonctionné pour moi - 

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

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.

11
Kihats

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 .

9
Carloso
  1. Tout d’abord, vérifiez votre version de MySQL avec $mysql --version $mysql Ver 14.14 Distrib 5.5.11

Puis changez le dialecte en conséquence 

  1. puis changez la propriété dialecte/Pour cet exemple, j'ai donné 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

1
Dipayan Das

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

1
urug

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>
0
Angad Bansode

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.

0
Prakhar Agrawal

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>
0
Cristi B.

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

0
Ashish Sharma