问题
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:
- First, check your MySQL version with
$mysql --version $mysql Ver 14.14 Distrib 5.5.11
Then change Dialect accordingly
- 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