无法获得spring boot以自动创建数据库架构

时间:2014-11-12 07:47:00

标签: java mysql spring hibernate spring-boot

启动时,我无法使用spring boot自动加载我的数据库架构。

这是我的application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=test
spring.datasource.password=
spring.datasource.driverClassName = com.mysql.jdbc.Driver

spring.jpa.database = MYSQL

spring.jpa.show-sql = true

spring.jpa.hibernate.ddl-auto = create
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

这是我的Application.java:

@EnableAutoConfiguration
@ComponentScan
public class Application {
    public static void main(final String[] args){
        SpringApplication.run(Application.class, args);
    }
}

以下是一个示例实体:

@Entity
@Table(name = "survey")
public class Survey implements Serializable {

    private Long _id;

    private String _name;

    private List<Question> _questions;

    /**
     * @return survey's id.
     */
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "survey_id", unique = true, nullable = false)
    public Long getId() {
        return _id;
    }

    /**
     * @return the survey name.
     */
    @Column(name = "name")
    public String getName() {
        return _name;
    }


    /**
     * @return a list of survey questions.
     */
    @OneToMany(mappedBy = "survey")
    @OrderBy("id")
    public List<Question> getQuestions() {
        return _questions;
    }

    /**
     * @param id the id to set to.
     */
    public void setId(Long id) {
        _id = id;
    }

    /**
     * @param name the name for the question.
     */
    public void setName(final String name) {
        _name = name;
    }

    /**
     * @param questions list of questions to set.
     */
    public void setQuestions(List<Question> questions) {
        _questions = questions;
    }
}

任何想法我做错了什么?

28 个答案:

答案 0 :(得分:45)

有几种可能的原因:

  1. 您的实体类在相同或子包中相对于您使用@EnableAutoConfiguration.进行分类的情况如果没有,那么您的spring应用程序看不到它们因此不会在db中创建任何内容
  2. 检查你的配置,似乎你正在使用一些特定于hibernate的选项,尝试用以下内容替换它们:

    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    spring.jpa.hibernate.ddl-auto=update
    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=test
    spring.datasource.password=
    
  3. 您的application.properties必须位于src/main/resources文件夹中。

  4. 如果你没有正确指定dialect,它可能会尝试默认与boot in-memory数据库捆绑在一起(和我一样)我可以看到它尝试连接到本地HSQL(参见console输出)实例并且在更新模式时失败。

答案 1 :(得分:40)

您是否尝试过运行它:

spring.jpa.generate-ddl=true

然后

spring.jpa.hibernate.ddl-auto = create
  

默认情况下,DDL执行(或验证)将延迟到ApplicationContext启动。还有一个spring.jpa.generate-ddl标志,但如果Hibernate autoconfig处于活动状态,则不会使用它,因为ddl-auto设置更精细。

请参阅spring-boot-features

答案 2 :(得分:13)

@SpringBootApplication
@EnableConfigurationProperties
@EntityScan(basePackages = {"com.project.ppaa.model"})  // scan JPA entities
public class Application {

  private static ConfigurableApplicationContext applicationContext;

  public static void main(String[] args) {
    Application.applicationContext = SpringApplication.run(Application.class, args);
  }
}

它应该自动工作,但如果没有,你可以输入基础包

@EntityScan(basePackages = {"com.project.ppaa.model"})  // scan JPA entities manually

答案 3 :(得分:6)

如果您的实体类与主类不在同一个包中,则可以在主类中使用@EntityScan注释,指定要保存或打包的实体。就像你的模型包一样。

关于:

spring.jpa.hibernate.ddl-auto = create

您可以使用update选项。它不会删除任何数据,并会以相同的方式创建表。

答案 4 :(得分:6)

使用以下两个设置确实有效。

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create

答案 5 :(得分:2)

在我的情况下,即使我使用JPArepository,也没有自动创建表。 在我的springboot app application.properties文件中添加以下属性后,现在将自动创建表。 的 spring.jpa.hibernate.ddl-自动=更新

答案 6 :(得分:2)

对我来说,以上给出的答案均无济于事,因为后来我发现问题出在我的pom文件中。我使用了spring boot starter项目,并添加了另一种不起作用的spring jpa。 最初我有这个,

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
    </dependency> 

我将其替换为:

   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
   </dependency> 

记下 spring-boot-starter-data-jpa 。希望这可以对某人有所帮助。检查您的pom文件,并确保您的依赖项匹配。

答案 7 :(得分:2)

我也有同样的问题。原来我在主Application类上设置了@PropertySource注释来读取不同的基本属性文件,因此不再使用普通的“application.properties”。

答案 8 :(得分:1)

您需要根据您的Spring Boot版本及其下载的库版本提供配置。

我的设置:Spring Boot 1.5.x(在我的情况下为1.5.10)下载Hibernate v5.x

仅在您的Spring Boot设置已下载Hibernate v4时使用以下内容。

  

spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

Hibernate 5不支持上述功能。

如果您的Spring Boot Setup已经下载了Hibernate v5.x,那么请选择以下定义:

  

spring.jpa.hibernate.naming.physical策略= org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

重要: 在Spring Boot应用程序开发中,您应该更喜欢使用注释:@SpringBootApplication,它已经过以下注释:@SpringBootConfiguration and @EnableAutoConfiguration

现在 如果您的实体类与Main Class所在的包不同,则Spring Boot不会扫描这些包。

因此,您需要明确定义注释:@EntityScan(basePackages = { "com.springboot.entities" })
此注释扫描基于JPA的带注释的实体类(以及其他类似MongoDB,Cassandra等)

注意: “com.springboot.entities”是自定义包名。

以下是我在application.properties中定义基于Hibernate和JPA的属性来创建表的方法: -

  

spring.datasource.driver类名= com.mysql.jdbc.Driver
  spring.datasource.url =的jdbc:mysql的://本地主机:3333 /开发useSSL =真的吗?   spring.datasource.username =管理员
  spring.datasource.password =

     

spring.jpa.open式视=假
  spring.jpa.hibernate.ddl-AUTO =创建
  spring.jpa.generate-ddl = true
  spring.jpa.hibernate.use新-ID-发电机映射=真
  spring.jpa.hibernate.naming.physical策略= org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
  spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
  spring.jpa.show-SQL =真
  spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
  spring.jpa.properties.hibernate.format_sql =真

我可以使用上面提到的配置创建表格。

请参阅并在适用的地方更改您的代码。

答案 9 :(得分:1)

我遇到了类似的问题。我使用的是Spring Boot 2.x,却错过了在Spring Initializer中添加Postgres依赖项的过程。 我手动添加了依赖项

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>

这就是我得到的- 信息org.hibernate.dialect.Dialect-HHH000400:使用方言: org.hibernate.dialect.PostgreSQLDialect 代替

**INFO  org.hibernate.dialect.Dialect - HHH000400: Using 
dialect:org.hibernate.dialect.PostgreSQL10Dialect**

这将我连接到数据库

并不是很奇怪,因为Springboot本身会进行版本依赖并减少开发工作。另一方面,如果Springboot选择了不正确的依赖关系,则会浪费很多时间。

答案 10 :(得分:1)

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update

MySQL5Dialect是骗人的,以前我使用的是'MySQLDialect'

答案 11 :(得分:1)

这是我在阅读完以上所有答案后所做的。

  1. #! /bin/bash Var = `anil` If [ -n "$Var" ] ; then echo " nn" else echo "emp" fi 和其他简单属性添加到 application.properties
  2. 运行
  3. 在控制台中,您可以看到错误。在错误的某个位置,您可以找到此软件生成的SQL代码以创建您的实体表。
  4. 复制该SQL代码并将其分别粘贴到DBMS中以创建表。
  5. 之后,再次运行该应用程序。

答案 12 :(得分:0)

在我的情况下,我不得不用名称 user 重命名表。例如,我将它重命名为 users 并且它起作用了。

答案 13 :(得分:0)

使用springboot连接到mysql并自动在数据库中创建表: spring.datasource.url=jdbc:mysql://localhost:3306/solace spring.datasource.username=root spring.datasource.password=root spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=update

答案 14 :(得分:0)

这个对我有帮助

我假设你有 INNODB 引擎:

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect

spring.jpa.properties.hibernate.dialect.storage_engine=innodb

答案 15 :(得分:0)

如果您在Spring Boot上遇到此问题,请仔细检查您的软件包名称,该名称应与以下内容完全相同:

com.example.YOURPROJECTNAME - consists main application class
com.example.YOURPROJECTNAME.entity - consists entities

答案 16 :(得分:0)

我有同样的问题,但我补充

spring.jpa.hibernate.ddl-auto = create

现在一切正常

答案 17 :(得分:0)

以下配置对我有用:

spring.jpa.properties.javax.persistence.schema-generation.database.action=create
spring.jpa.properties.javax.persistence.schema-generation.create-database-schemas=true
spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata
spring.jpa.properties.javax.persistence.schema-generation.drop-source=metadata
spring.jpa.properties.javax.persistence.schema-generation.connection=jdbc:mysql://localhost:3306/your_database

答案 18 :(得分:0)

我用这种解决方案解决了我的案件。 只是在 application.properties 文件的 spring.datasource.url 属性上插入一个新参数 createDatabaseIfNotExist = true ,如下所示:

public class DataContainer : INotifyPropertyChanged
    {
        private int number1 = 0;
        private string text1 = "none";
        private System.Timers.Timer aTimer;
        public event PropertyChangedEventHandler PropertyChanged;

        public DataContainer(int num,string str)
        {
            number1 = num;
            text1 = str;
            aTimer = new System.Timers.Timer(num*1000);
            aTimer.Elapsed += OnTimedEvent;
            aTimer.AutoReset = true;
            aTimer.Enabled = true;
        }
        private void OnTimedEvent(object sender, ElapsedEventArgs e)
        {
            Random r = new Random();
            number1 = r.Next(0, 100);
            number1 += 1;
            this.NotifyPropertyChanged("Number1");
        }
        public int Number1
        {
            get { return this.number1; }
            set
            {
                if (this.number1 != value)
                {
                    this.number1 = value;
                    this.NotifyPropertyChanged("Number1");
                }
            }
        }
        public string Text1
        {
            get { return this.text1; }
            set
            {
                if (this.text1 != value)
                {
                    this.text1 = value;
                    this.NotifyPropertyChanged("Text1");
                }
            }
        }
        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }

我具有带有DDL的 src / main / resources / Schema.sql 来创建数据库模式。我确实使用了 flyaway 来创建和维护表。

我在这里建立了这个解决方案: original answer

答案 19 :(得分:0)

只需在spring数据源网址中添加 createDatabaseIfNotExist = true 参数

示例: spring.datasource.url = jdbc:mysql:// localhost:3306 / test?createDatabaseIfNotExist = true

答案 20 :(得分:0)

Abderrahmane的响应是正确的:在url属性中添加?createDatabaseIfNotExist=true。 看来ddl-auto不会做任何事情。

答案 21 :(得分:0)

如果您的数据库是MySQL:

spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=root

如果您的数据库是PostgreSQL:

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:postgresql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=root

答案 22 :(得分:0)

您只需像这样添加with tf.device("your_device_name")

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using FSG.MeshAnimator;


public class ZombieAI : MonoBehaviour
{
    /// <summary>
    /// Components
    /// </summary>
    MeshAnimator mesh;
    AudioSource audioSrc;
    SphereCollider sphereCollider;
    CapsuleCollider capsuleCollider;
    NavMeshAgent agent;

    /// <summary>
    /// Child Objects
    /// </summary>
    GameObject EnemyIcon;


    /// <summary>
    /// Animations
    /// </summary>
    public MeshAnimation[] deathAnimations = new MeshAnimation[5];
    string curDeathAnimations;
    public MeshAnimation[] runAnimations = new MeshAnimation[1];

    /// <summary>
    /// Sounds
    /// </summary>
    public AudioSource _as;
    public AudioClip[] infectedNoises;
    public int randomNoiseNum;


    /// <summary>
    /// Textures
    /// </summary>
    public Texture[] mantexture = new Texture[16];
    public Texture[] womantexture = new Texture[17];


    /// <summary>
    /// Health
    /// </summary>
    public float max_health = 5f;
    public float cur_health = 5f;
    public float distance;

    /// <summary>
    /// Awareness
    /// </summary>
    public bool female;
    public bool alive;
    public bool spotted = false;
    public bool attack = false;
    bool create = false;

    /// <summary>
    /// Targets
    /// </summary>
    public GameObject target;

    /// <summary>
    /// Veriables
    /// </summary>
    public float velocity;
    private Vector3 previous;
    [Range(0f, 1.35f)]
    public float attackRange;
    [Range(3f, 5f)]
    public float runAttackRange;
    [Range(1f, 100f)]
    public float detectionRange;
    [Range(1f, 10f)]
    public float runSpeed = 3.5f;
    float onMeshThreshold = 3;

    private void Start()
    {
        if (female == false)
        {
            gameObject.GetComponent<Renderer>().material.SetTexture("_MainTex", mantexture[Random.Range(0, mantexture.Length)]);
        }
        if (female == true)
        {
            GetComponent<Renderer>().material.SetTexture("_MainTex", womantexture[Random.Range(0, womantexture.Length)]);
        }


        curDeathAnimations = deathAnimations[Random.Range(0, deathAnimations.Length)].name;
        //EnemyIcon = transform.Find("Enemy-Icon").gameObject;
        mesh = GetComponent<MeshAnimator>();
        audioSrc = GetComponent<AudioSource>();
        _as = GetComponent<AudioSource>();
        sphereCollider = GetComponent<SphereCollider>();
        capsuleCollider = GetComponent<CapsuleCollider>();
        agent = GetComponent<NavMeshAgent>();
        target = GameObject.FindGameObjectWithTag("Player");

        alive = true;


        if (transform.position.y <= 0 && transform.position.y >= 1)
        {
            Destroy(gameObject);
        }


    }

    public void Update()
    {

        if (alive)
        {

            distance = Vector3.Distance(target.transform.position, transform.position);
            velocity = ((transform.position - previous).magnitude) / Time.deltaTime;
            previous = transform.position;



            if (transform.position.y <= 1 && transform.position.y >= -1)
            {
                create = true;
                if (create == false)
                {
                    Destroy(gameObject);
                }
                else if (create == true)
                {
                    agent.SetDestination(target.transform.position);
                }

            }


            if (velocity > 0 && !attack)
            {
                mesh.speed = velocity / 3;
                mesh.Play("Run1-0");
            }

            if (velocity > 0 && attack && spotted)
            {
                spotted = true;
                mesh.Play("Run Attack");
            }
            else if (velocity == 0 && attack && spotted)
            {
                mesh.Play("Attack1-0");
            }

            if (distance < detectionRange)
            {
                spotted = true;
            }

            if (spotted && distance < attackRange)
            {
                Vector3 targetPosition = new Vector3(target.transform.position.x, transform.position.y, target.transform.position.z);
                transform.LookAt(targetPosition);
            }

                        randomNoiseNum = Random.Range(0, 400);
            if (alive && randomNoiseNum == 20)
            {
                PlayRandomNoise();
            }

        }

       /* if (alive && distance > attackRange && velocity <= 0.05f && !attack)
        {
            mesh.Play("Idle1-0");
        }*/

            if (!alive)
            {
            //mesh.Play(curDeathAnimations);
            //ScoreManager.scoreValue += 1;
            Destroy(gameObject, 5);
            }

            if (cur_health <= 0)
            {
            mesh.speed = 1;
                alive = !alive;
                mesh.Play(curDeathAnimations);
                //Destroy(mesh,0);
                Destroy(EnemyIcon);
                Destroy(audioSrc, 0);
                Destroy(sphereCollider, 0);
                Destroy(capsuleCollider, 0);
                Destroy(agent, 0);

                alive = false;

            }


    }

    void OnTriggerStay(Collider col)
    {
        attack = true;
    }

    void OnTriggerExit(Collider col)
    {
        attack = false;
    }

    public void PlayRandomNoise()
    {
        if (female == true)
        {
            _as.volume = 2.0f;
            _as.clip = infectedNoises[Random.Range(0, infectedNoises.Length)];
            _as.pitch = Random.Range(1.10f, 1.35f);
            _as.PlayOneShot(_as.clip);
        }
        else
        {
            _as.volume = 2.0f;
            _as.pitch = Random.Range(0.75f, 1.05f);
            _as.clip = infectedNoises[Random.Range(0, infectedNoises.Length)];
            _as.PlayOneShot(_as.clip);
        }

    }


}

到您的application.properties文件

答案 23 :(得分:0)

很简单,我们在spring.jpa.hibernate.ddl-auto = create;后添加分号 这是错误的spring.jpa.hibernate.ddl-auto = create足够的

答案 24 :(得分:0)

之前我遇到过同样的问题。我的问题是我试图通过使用&#34; List&#34;来建立的实体关系。我知道这是原因,因为没有list变量,程序运行正常。在你的情况下,我认为问题是:

private List<Question> _questions;

我假设您已经有一个名为Question的课程。所以,试着:

@OneToMany
private Question _questions;

但事实是,在你的方法中,你将处理它,所以它返回一个列表。我将Spring Data JPA与CrudRepository一起使用。所以,如果你决定使用它,你的可能会是这样的:

public List<Question> findById( Long _id );

您需要做更多更改,但这些更改非常简单明了。请参阅this Java Brains video以更好地掌握并了解还需要修改的内容。

答案 25 :(得分:0)

Use this Sample code

application.properties
# DataSource settings: set here your own configurations for the database 
# connection. In this example we have "dojsb" as database name and 
# "root" as username and password.
spring.datasource.url =jdbc:postgresql://localhost:5432/usman
spring.datasource.username = postgres
spring.datasource.password = 12345

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = create

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

server.port = 8963



Entity Class:



import java.sql.Timestamp;
import java.util.UUID;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Type;


@Entity
@Table(name = "QUEUERECORDS")
public class QueuesRecords {
    @Id
    private UUID id;

    @Column(name="payload", nullable = true)
    @Type(type="text")
    private String payload;


    @Column(name="status", nullable = true)
    @Type(type="text")
    private String status;

    private Timestamp starttime;

    private Timestamp endtime;

    @Column(name="queueid",nullable= true)
    @Type(type="text")
    private String queueid;

    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    public String getPayload() {
        return payload;
    }

    public void setPayload(String payload) {
        this.payload = payload;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Timestamp getStarttime() {
        return starttime;
    }

    public void setStarttime(Timestamp starttime) {
        this.starttime = starttime;
    }

    public Timestamp getEndtime() {
        return endtime;
    }

    public void setEndtime(Timestamp endtime) {
        this.endtime = endtime;
    }

    public String getQueueid() {
        return queueid;
    }

    public void setQueueid(String queueid) {
        this.queueid = queueid;
    }



}



Main class



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Test{

    public static void main(String[] args) {

        SpringApplication.run(Test.class, args);


    }
}

答案 26 :(得分:-1)

我遇到了同样的问题,只用这个添加解决了它:

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

答案 27 :(得分:-3)

添加

spring.jpa.databaseplatform=org.hibernate.dialect.PostgreSQLDialect  

最后。这将解决您的问题。 只有这个缺失