【问题标题】:Hibernate doesn't create tables automaticallyHibernate 不会自动创建表
【发布时间】:2018-11-19 07:24:01
【问题描述】:

我有带有 Hibernate/Spring/MySQL 的 Maven 项目。我有基本实体,我希望 Hibernate 自动创建表,但 Hibernate 不创建任何表。也没有抛出异常,所以我不知道这里出了什么问题。

application.properties:

# ===============================
# = DATA SOURCE
# ===============================
spring.datasource.url = jdbc:mysql://localhost:3306/task
spring.datasource.username = root
spring.datasource.password = 12345678
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# ===============================
# = JPA / HIBERNATE
# ===============================
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.format_sql = true
spring.jpa.properties.hibernate.id.new_generator_mappings = true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=15
spring.datasource.tomcat.test-while-idle=true
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.time-between-eviction-runs-millis=3600000
spring.datasource.tomcat.validation-query=SELECT 1

用户.java:

package com.example.model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Table(name = "user")
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;

    @Column(name = "telegramId")
    private Integer telegramId;

    @Column(name = "firstName")
    private String firstName;

    @Column(name = "lastName")
    private String lastName;

    @OneToMany(
            mappedBy = "user",
            cascade = CascadeType.ALL,
            orphanRemoval = true
            )
    private List<Message> msg = new ArrayList<>();
}

在 User.java 中,我也使用 lombok。有什么建议? 谢谢你。

【问题讨论】:

  • 尝试将spring.jpa.generate-ddl=true 添加到您的属性中
  • 您的代码看起来不错。您是否尝试过进行一些单元测试?创建一个存储库以从数据库中插入/提取数据。

标签: java mysql spring hibernate


【解决方案1】:

我也遇到过同样的问题。以下可能是原因之一。

就我而言:

之前,
配置类在 com.abc.school 包中,并且 我的实体类在 com.abc.entity 包内。

所以,实体类的包名不正确。 应该是 com.abc.school.entity

【讨论】:

    【解决方案2】:

    就我而言,我相信,因为我使用的是hibernate 5,所以hibernate 5应该会自动解决columns表的一些格式问题,有些表没有创建,但有些表是。 我区分文件以分析差异......问题是...... 我正在使用一个属性,这阻碍了表的创建......

    @Column(nullable = false, columnDefinition = "DECIMAL(6,6) DEFAULT 0.00")
    private Double longitude;
    

    我已经删除columnDefinition = "DECIMAL(6,6) DEFAULT 0.00",表创建正常。

    【讨论】:

      【解决方案3】:

      测试更改表的名称,这对我有用。

      【讨论】:

        【解决方案4】:

        我找到了解决方案。问题是Application.java 在包com.example.BotApp. 中,现在它在com.example. 中。我不知道,但不知何故它有所帮助。

        【讨论】:

        • 这意味着你的实体类没有被spring boot注解扫描(默认情况下扫描当前包及其子包)拾取。它在docs.spring.io/spring-boot/docs/current/reference/html/… 上进行了解释。如果你的主类有它自己的包,比如com.example.boot,你需要添加scanBasePackages,像这样:@SpringBootApplication(scanBasePackages = {"com.example" }) 以便扫描其他包中的所有内容
        • 同样的事情发生在我身上......当我将包创建为 Application.java 包的子包时,一切正常
        【解决方案5】:

        如果你使用spring-data(我希望你是这样),删除@Table 注解,Spring 将自动从@Entity 创建一个名为user 的表。 application.propertes 中的最低配置应该是这样的:

        # Hibernate
        spring.datasource.platform=mysql
        spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
        spring.jpa.hibernate.ddl-auto=update
        
        # Mysql
        spring.datasource.driverClassName=com.mysql.jdbc.Driver
        spring.datasource.url=jdbc:mysql://yourdburl:3306/test?createDatabaseIfNotExist=true // creates a schema if doesn't exist
        spring.datasource.username=root
        spring.datasource.password=12345678
        

        spring.jpa.hibernate.ddl-auto=update 将在您的应用每次连接到它时更新您的数据库表(如有必要)。如果没有,它也应该创建它。 其他值为 createcreate-drop 这几乎是不言自明的

        【讨论】:

          【解决方案6】:

          您的属性文件中缺少此属性

          hibernate.hbm2ddl.auto="update"

          spring.jpa.properties.hibernate.hbm2ddl.auto=update
          

          创建 sessionFactory 时,hibernate.hbm2ddl.auto 会自动验证并将 DDL 导出到架构。

          默认情况下,它不会在 db 上自动进行任何创建或修改。如果用户将值设置为 update 或 create 或 validate 或 create-drop,那么它会根据给定的值自动更改 DDL 架构。

          【讨论】:

          • 不幸的是,它没有帮助
          猜你喜欢
          • 2017-08-23
          • 2012-07-02
          • 2018-08-18
          • 2021-09-15
          • 1970-01-01
          • 2011-04-05
          • 2020-11-16
          • 2013-12-04
          • 2016-05-26
          相关资源
          最近更新 更多