Hibernate is not auto-creating a table that does not exist in the DB

爷,独闯天下 提交于 2019-11-30 21:42:34

问题


I have a basic Hibernate code, I have set the property "hibernate.hbm2ddl.auto" as update still it is not auto-creating the table in the Database.

These are the required files:

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>

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

This is the Main.java that I am trying to run:

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 {

        }

    }
}

This is the error that I get:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table '**.responsibilities' doesn't exist


回答1:


I had the same issue, this worked for me -

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



回答2:


The following scenario could be another reason why Hibernate cannot auto-create your table:

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

The table Employee will not be auto-created by Hibernate since empID is a String and it has the @GeneratedValue annotation. empID should be an int or long. I had this problem sometime and I changed my id field that had the @GeneratedValue annotation to be of type int and Hibernate auto-created the table.




回答3:


I had the same problem, I solved it by changing:

org.hibernate.dialect.MySQLInnoDBDialect

to

org.hibernate.dialect.MySQLDialect

I found the solution in this question.




回答4:


Why don't you try create or create-drop instead. Seems to serve your purpose. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-optional




回答5:


  1. First, check your MySQL version with $mysql --version $mysql Ver 14.14 Distrib 5.5.11

Then change Dialect accordingly

  1. then change the dialect property /For this example I have given MySQL55Dialect/ org.hibernate.dialect.MySQL55Dialect

//////////////////////////////////////////////// --where you can find Dialect:

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

Hope this Help




回答6:


I had the same issue, but for me the solution was:

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

instead of

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



回答7:


Hibernate can create table, hibernate sequence and tables used for many-to-many mapping on your behalf but you have to explicitly configure it by calling setProperty("hibernate.hbm2ddl.auto", "create") of Configuration object. By Default it just validate the schema with DB and fail if anything not already exist by giving error "ORA-00942: table or view does not exist".




回答8:


For the existing working environment, or for any big application area, it's not recommended to set hibernate.hbm2ddl.autoon create or create-drop , as it is shown below

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

though it works, but it will drop all the existing tables of the database every time you restart the server.

If you are using the hibernate jar version 5.2.0 then please switch to either lower or any other version.This version jar is having some issue regarding update.

It worked for me and i hope it will work for others too.




回答9:


Just do correct configuration

1) Create, Every time a new table will create. All Old data will be deleted.

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

2) Update, If any modification has done then same will reflect to DB.

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


来源:https://stackoverflow.com/questions/20089470/hibernate-is-not-auto-creating-a-table-that-does-not-exist-in-the-db

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!