Hibernate不会自动创建DB中不存在的表

时间:2013-11-20 07:02:53

标签: hibernate hibernate-mapping

我有一个基本的Hibernate代码, 我已将属性“hibernate.hbm2ddl.auto”设置为更新仍然不会在数据库中自动创建表。

这些是必需的文件:

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>

这是我正在尝试运行的Main.java:

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 {

        }

    }
}

这是我得到的错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表' * *。职责'不存在

13 个答案:

答案 0 :(得分:16)

我有同样的问题,这对我有用 -

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

答案 1 :(得分:14)

以下情况可能是Hibernate无法自动创建表的另一个原因:

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

Hibernate不会自动创建表Employee,因为empIDString并且它具有@GeneratedValue注释。 empID应为intlong。 我有时遇到这个问题而且我将id注释的@GeneratedValue字段更改为int类型,并且Hibernate自动创建了表。

答案 2 :(得分:11)

我遇到了同样的问题,我通过更改解决了这个问题:

org.hibernate.dialect.MySQLInnoDBDialect

org.hibernate.dialect.MySQLDialect

我在this question找到了解决方案。

答案 3 :(得分:2)

为什么不尝试创建或创建drop。似乎是为了你的目的。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-optional

答案 4 :(得分:2)

  1. 首先,使用$mysql --version $mysql Ver 14.14 Distrib 5.5.11检查您的MySQL版本

然后相应地更改方言

  1. 然后更改方言属性/在此示例中,我给了MySQL55Dialect/ org.hibernate.dialect.MySQL55Dialect

///////////////////////////////////////////////// /-在这里可以找到方言:

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

希望此帮助

答案 5 :(得分:2)

我添加到 Spring application.properties 并工作

spring.datasource.driver.class-name=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true

答案 6 :(得分:0)

我有同样的问题,但对我来说解决方案是:

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

而不是

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

答案 7 :(得分:0)

Hibernate可以代表您创建用于多对多映射的表,hibernate序列和表,但是您必须通过调用Configuration对象的setProperty(“hibernate.hbm2ddl.auto”,“create”)来显式配置它。默认情况下,它只是使用DB验证模式,如果通过提供错误“ORA-00942:表或视图不存在”而存在任何不存在的情况则会失败。

答案 8 :(得分:0)

对于现有的工作环境或任何大型应用程序区域,不建议设置hibernate.hbm2ddl.autoon create或create-drop ,如下所示

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

尽管可以,但是每次重新启动服务器时,它将删除数据库的所有现有表。

如果您使用的是休眠jar版本5.2.0 ,请切换到较低版本或任何其他版本。此版本jar存在有关更新的问题。

它对我有用,我希望它也对其他人有用。

答案 9 :(得分:0)

只需正确配置

1)创建,每次创建新表时。所有旧数据将被删除。

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

2)更新,如果进行了任何修改,则修改将反映到数据库中。

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

答案 10 :(得分:0)

如果您正在使用Hibernate 5或更高版本,则可以通过将方言更改为org.hibernate.dialect.MySQL5Dialect来解决。 它对我有用。

答案 11 :(得分:0)

application.properties 中添加这个对我有用

spring.jpa.generate-ddl=true

答案 12 :(得分:-1)

3 小时后就我而言,我在包名称中使用了错误的 groupID 和 artifact。