web-dev-qa-db-ja.com

データベーススキーマを自動的に作成するスプリングブートを取得できません

起動時にデータベーススキーマを自動的にロードするスプリングブートを取得できません。

ここに私の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;
    }
}

私が間違っていることは何ですか?

44
napentathol

考えられる原因はいくつかあります。

  1. エンティティクラスは、@EnableAutoConfiguration.を使用してクラスを持っているのと同じか、サブパッケージに関連するものにあります。そうでない場合、Springアプリはそれらを表示しないため、dbには何も作成されません
  2. 構成を確認してください。いくつかの休止状態固有のオプションを使用しているようです。それらを次のものに置き換えてみてください。

    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.propertiessrc/main/resourcesフォルダーになければなりません。

方言を正しく指定しなかった場合、デフォルトでブートインメモリデータベースとバンドルされ、(私と同じように)ローカルHSQL(コンソール出力を参照)インスタンスに接続しようとすることがわかりますスキーマの更新に失敗します。

49
borys86

あなたはそれを実行しようとしましたか:

spring.jpa.generate-ddl=true

その後

spring.jpa.hibernate.ddl-auto = create

デフォルトでは、ApplicationContextが開始されるまで、DDLの実行(または検証)は延期されます。 spring.jpa.generate-ddlフラグもありますが、ddl-auto設定がよりきめ細かいため、Hibernate autoconfigがアクティブな場合は使用されません。

spring-boot-features を参照してください

41
liorsolomon
@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
14
Ar maj

次の2つの設定を使用しても機能します。

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

エンティティクラスがメインクラスと同じパッケージにない場合は、メインクラスで@EntityScanアノテーションを使用して、保存またはパッケージするエンティティも指定できます。モデルパッケージと同様。

約:

spring.jpa.hibernate.ddl-auto = create

オプションupdateを使用できます。データは消去されず、同じ方法でテーブルが作成されます。

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

MySQL5Dialectはトリックでした。以前は「MySQLDialect」を使用していました

2
asifaftab87

私の場合、JPArepositoryを使用していても、テーブルは自動的に作成されませんでした。 springbootアプリのapplication.propertiesファイルに以下のプロパティを追加すると、テーブルが自動的に作成されます。 spring.jpa.hibernate.ddl-auto = update

2
Jayant Nayak

私も同じ問題を抱えています。メインのApplicationクラスに@PropertySourceアノテーションを設定して別のベースプロパティファイルを読み取ることがわかったため、通常の「application.properties」は使用されなくなりました。

2
user3206144

これは私が上記のすべての答えを読んだ後にしたことです。

  1. spring.jpa.hibernate.ddl-auto=updateを他の単純なプロパティとともにapplication.propertiesに追加します
  2. 走る
  3. コンソールで、エラーを確認できます。エラーの1つの場所で、このソフトウェアによって生成されたSQLコードを見つけて、エンティティテーブルを作成できます。
  4. そのSQLコードをコピーし、DBMSに個別に貼り付けて、テーブルを作成します。
  5. その後、アプリを再度実行します。
1

以前にも同じ問題がありました。私の問題は、「リスト」を使用して確立しようとしたエンティティの関係でした。リスト変数なしでプログラムが正常に実行されたため、それが原因であることがわかりました。あなたの場合、問題は次のとおりだと思います。

private List<Question> _questions;

Questionという名前のクラスが既にあると仮定しています。だから、持ってみてください:

@OneToMany
private Question _questions;

しかし、問題は、メソッドでリストを返すように処理することです。 Spring Data JPAとCrudRepositoryを使用しました。したがって、使用することにした場合、次のようになります。

public List<Question> findById( Long _id );

必要な変更は他にもありますが、これらは非常に簡単で簡単です。 this Java Brains video を参照して、他に何を変更する必要があるかをよりよく把握してください。

1
lamarre

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-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

重要:Spring Bootアプリケーションの開発では、次のアノテーションを使用することをお勧めします:@SpringBootApplicationにはスーパーアノテーションが付けられています:@SpringBootConfiguration and @EnableAutoConfiguration

NOWエンティティクラスがメインクラスが存在するパッケージとは異なるパッケージにある場合、Spring Bootはそれらのパッケージをスキャンしません。

したがって、注釈を明示的に定義する必要があります:@EntityScan(basePackages = { "com.springboot.entities" })
この注釈は、JPAベースの注釈付きエンティティクラス(およびMongoDB、Cassandraなどのその他)をスキャンします。

注: "com.springboot.entities"はカスタムパッケージ名です。

以下は、表を作成するためにapplication.propertiesでHibernateおよびJPAベースのプロパティを定義した方法です。

spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql:// localhost:3333/development?useSSL = true spring.datasource.username = admin
spring.datasource.password =

spring.jpa.open-in-view = false
spring.jpa.hibernate.ddl-auto = create
spring.jpa.generate-ddl = true
spring.jpa.hibernate.use-new-id-generator-mappings = true
spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.show-sql = true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.format_sql = true

上記の構成を使用してテーブルを作成できます。

それを参照し、必要に応じてコードを変更してください。

1
Philip Dilip
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);


    }
}
0
Usman Yaqoob

このようにcreateDatabaseIfNotExist=trueを追加するだけです

spring.datasource.url=jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8&amp;amp;autoReconnect=true

application.propertiesファイルに

0
Abderrahmane

後にセミコロンを追加します
spring.jpa.hibernate.ddl-auto = create;
これは間違っています
spring.jpa.hibernate.ddl-auto = create
十分な

0
Ansar Mohamed

dBが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

dBが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
0
Wendell Tufano

Abderrahmaneの応答は正しい:urlプロパティに?createDatabaseIfNotExist=trueを追加します。 ddl-autoは何もしないようです。

0
Camilo

createDatabaseIfNotExist = trueパラメーターをSpringデータソースurlに追加するだけです

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

0
Nitin Pawar