Hibernate 不会自动创建数据库中不存在的表

Posted

技术标签:

【中文标题】Hibernate 不会自动创建数据库中不存在的表【英文标题】:Hibernate is not auto-creating a table that does not exist in the DB 【发布时间】:2013-12-04 01:31:45 【问题描述】:

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

这些是必需的文件:

员工.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>

责任.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: 表'**.责任'不存在

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

对我也是。地球上可能没有人能说,为什么我们必须使用 $§%&"§$ 有时"hibernate.something" 属性,有时只使用"something"... 我也面临同样的问题,我之前也尝试过create,但没有成功。我不知道我是否必须提出一个新问题。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

org.hibernate.dialect.MySQLInnoDBDialect

org.hibernate.dialect.MySQLDialect

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

【讨论】:

方言的空间版本也是如此。 Hibernate 有很多神秘的错误日志。 提到的问题建议:MySQL5InnoDBDialect 而不是 MySQLInnoDBDialect 这对我有用。【参考方案4】:
    首先,使用$mysql --version $mysql Ver 14.14 Distrib 5.5.11 检查您的 MySQL 版本

然后相应地改变方言

    然后改变方言属性/对于这个例子我给了MySQL55Dialect/ org.hibernate.dialect.MySQL55Dialect

/////////////////////////////////////// / --你可以在哪里找到方言:

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

希望得到帮助

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

而不是

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

【讨论】:

【参考方案7】:

我添加到 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

【讨论】:

【参考方案8】:

如果你使用的是 Hibernate 5 或更高版本,这将通过将方言更改为 org.hibernate.dialect.MySQL5Dialect 来解决。 它对我有用。

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

对于现有的工作环境,或者对于任何大的应用领域,不建议设置 hibernate.hbm2ddl.autoon create 或 create-drop ,如下图

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

虽然有效,但每次重启服务器时都会删除数据库中所有现有的表。

如果您使用的是 hibernate jar 版本 5.2.0,请切换到较低版本或任何其他版本。此版本 jar 在更新方面存在一些问题。

它适用于我,我希望它也适用于其他人。

【讨论】:

【参考方案11】:

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

spring.jpa.generate-ddl=true

【讨论】:

【参考方案12】:

只要做正确的配置

1) 创建,每次都会创建一个新表。所有旧数据将被删除。

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

2) 更新,如果进行了任何修改,则同样会反映到 DB。

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

【讨论】:

这不是回答失败的原因。我想每个人都知道创建或更新选项是做什么的。这是一个非常笼统的答案,没有理解问题。【参考方案13】:

3 小时后在我的情况下,我在包名称中使用了错误的 groupID 和 artifact。

【讨论】:

以上是关于Hibernate 不会自动创建数据库中不存在的表的主要内容,如果未能解决你的问题,请参考以下文章

如果 mysql 数据库中的表中不存在,则更新或插入多条记录

hibernate 不会创建所有关联的表

使用自动创建表时,Hibernate 不会自动为数据库创建序列

Access 查询在数据库中不存在的表上运行

Hibernate---hbm2ddl

JPA/Hibernate 在 Spring Boot 应用程序中插入不存在的表