【问题标题】:Does Hibernate create tables in the database automaticallyHibernate会自动在数据库中创建表吗
【发布时间】:2011-05-29 06:33:52
【问题描述】:

在阅读this(存档)教程时,他们没有提到在数据库中创建表的任何内容。一旦我指定它们,Hibernate 是否会通过创建表和字段来自动处理它。

这是我的 bean 配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
    
    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"/>
        <property name="username" value="monwwty"/>
        <property name="password" value="www"/>
    </bean>
    
    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>uk.co.vinoth.spring.domain.User</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
    </bean>
    
    <bean id="myUserDAO" class="uk.co.vinoth.spring.dao.UserDAOImpl">
        <property name="sessionFactory" ref="mySessionFactory"/>
    </bean>
    
    <bean name="/user/*.htm" class="uk.co.vinoth.spring.web.UserController" >
        <property name="userDAO" ref="myUserDAO" />
    </bean>
    
</beans>

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    如果属性hibernate.ddl-auto = update,则不会自动创建表。 要自动创建表,您需要将属性设置为 hibernate.ddl-auto = create

    spring boot 中使用的选项列表是

    • validate:验证架构,不更改数据库。

    • 更新:更新架构。

    • create:创建架构,销毁以前的数据。

    • create-drop:在会话结束时删除架构

    • :是所有其他情况

    所以第一次您可以将其设置为 create,然后下次您应该将其设置为 update

    【讨论】:

      【解决方案2】:

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

      如果您进行上述配置,则执行操作的顺序将是:- a) 删除所有表和序列,如果它们不存在,则不要给出错误。 b) 创建所有表和序列 c) 更改带有约束的表 d) 向其中插入数据。

      【讨论】:

        【解决方案3】:

        是的,Hibernate 可以通过 hibernate.hbm2ddl.auto 文件中的 hibernate.hbm2ddl.auto 属性进行配置,以便在您的数据库中自动创建表,以便在表不存在时将您的实体存储在其中。

        这在开发过程中很方便,可以使用新的in-memory, DB,并在应用程序的每次运行或测试期间创建一个新数据库。

        【讨论】:

          【解决方案4】:

          在您的 hibernate.cfg.xml 文件中添加以下属性

          &lt;property name="hibernate.hbm2ddl.auto"&gt;update&lt;/property&gt;

          顺便说一句,在您的 Entity 类中,您必须像这样定义您的 @Id 归档:

          @Id
          @GeneratedValue(generator = "increment")
          @GenericGenerator(name = "increment", strategy = "increment")
          @Column(name = "id")
          private long id;
          

          如果你使用下面的定义,它可能不起作用:

          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          @Column(name = "id")
          private long id;
          

          【讨论】:

            【解决方案5】:

            是的,你可以使用

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

            【讨论】:

              【解决方案6】:

              您的 hibernate.hbm2ddl.auto 设置应定义创建数据库(选项为 validatecreateupdatecreate-drop

              【讨论】:

              • 此设置可在休眠配置文件中找到。
              【解决方案7】:

              对我来说,即使将 hibernate.hbm2ddl.auto 设置为 update,它也无法正常工作。原来生成的创建 SQL 是无效的,因为我的一个列名(user)是一个 SQL 关键字。这失败了,直到我检查日志才明显发生了什么。

              【讨论】:

                【解决方案8】:

                是的,在您的情况下确实如此,因为您的配置中有以下属性。这在测试期间是可以的,但在生产中你需要禁用它。

                <prop key="hibernate.hbm2ddl.auto">create</prop>
                

                【讨论】:

                猜你喜欢
                • 2013-12-04
                • 2014-01-30
                • 2011-04-05
                • 2021-10-21
                • 2016-05-13
                • 2016-07-17
                • 2018-11-19
                • 2016-11-12
                相关资源
                最近更新 更多