Я не могу создавать таблицы в своей базе данных postgresql с помощью Springboot - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь, что Springboot создает таблицу в моей базе данных PostgreSQL, Spring правильно подключается к базе данных, но не создает таблицы.

pgadmin display

Конфигурация Hibernate

application.yaml

spring:

  datasource:
    url: jdbc:postgresql://localhost:5432/postgres
    username: postgres
    password: 1234
    driver-class-name: org.postgresql.Driver

  jpa:
    hibernate:
      ddl-auto: create-drop
    generate-ddl: true
    show-sql: true  

Это объект, который мне нужно поместить в базу данных

Пользователь. java

@Data
@Entity
@Table(name= "users")
public class User {
    //iduser
    @Id
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy="uuid2")
    private String idUser;

    private String firstName;
    private String lastName;
    private String email;
    private String password;
    private String rol;
    private String language;

    public User(){

    }
}

PostgressApplication. Java

package com.sample.postgres;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages="com.sample")
public class PostgresApplication {

    public static void main(String[] args) {
        SpringApplication.run(PostgresApplication.class, args);

    }

}

pom. xml

У меня много зависимостей в моем проекте, как вы можете видеть

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.sample</groupId>
    <artifactId>postgres</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>postgres</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

            <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--  JPA y Postgres -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Код моей структуры

Ответы [ 3 ]

0 голосов
/ 14 января 2020

попробуйте использовать только create вместо create-drop

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/postgres
    username: postgres
    password: 1234
    driver-class-name: org.postgresql.Driver
  jpa:
    hibernate:
      ddl-auto: create
    generate-ddl: true
    show-sql: true
    database-platform: org.hibernate.dialect.PostgreSQL9Dialect
      properties:
        hibernate:
          temp:
            use_jdbc_metadata_defaults: false
          jdbc:
            lob:
              non_contextual_creation: true
0 голосов
/ 14 января 2020

Краткий ответ: Добавьте @EntityScan("com.sample.modelo") в начало класса PostgresApplication:

package com.sample.postgres;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages="com.sample")
@EntityScan("com.sample.modelo")
public class PostgresApplication {

    public static void main(String[] args) {
        SpringApplication.run(PostgresApplication.class, args);

    }

}

Дополнительная информация:

Ваша конфигурация мне подходит. Убедитесь, что ваша сущность сканируется. Я имею в виду, что вы, возможно, настроили свой проект так, чтобы ваш класс сущностей не читался. Вот минимальная конфигурация, которая вам нужна:

  1. Используйте эту зависимость
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Имейте свой application.properties в src/main/resources
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=mysecretpassword

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

  1. Создайте свою сущность (у вас это уже есть)
@Data
@Entity
@Table(name= "users")
public class User {
    //iduser
    @Id
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy="uuid2")
    private String idUser;

    private String firstName;
    private String lastName;
    private String email;
    private String password;
    private String rol;
    private String language;

    public User(){

    }
}
У вас есть @SpringBootApplication класс
package your.package;

@SpringBootApplication
public class MainApp {

    public static void main(String[] args) {
        SpringApplication.run(StackTest.class);
    }

}

И это то, где это более чем важно! Если ваш класс сущности User не находится в подпакете your.package, то вам нужно добавить пользовательскую аннотацию к вашему @SpringBootApplication классу.

@SpringBootApplication
@EntityScan("my.other.package")
public class MainApp {

}

Подробнее о настройке Hibernate

При настройке приложения с использованием JPA без Spring-boot вам необходимо указать расположение классов сущностей (а также много другой информации) ,

Configuration configuration = new Configuration();
// many codes here
configuration.addPackage("my.package.for.entities");

Это заставляет hibernate сканировать определенные c пакеты для поиска ваших сущностей.

При использовании Spring-Boot вам не нужно писать все классы конфигурации. Но если ваши энтеиты (и это ваш случай) находятся в пакетах, отличных от @SpringBootApplication, вам нужно указать пакеты для сканирования с аннотацией @EntityScan("my.package.for.entities"). Действительно, эта аннотация интерпретируется классом JpaBaseConfiguration для поиска ваших сущностей.

Аннотация @SpringBootApplication(scanBasePackages = "my.package") здесь, чтобы искать ваши бобы весны, а не ваши сущности.

Если все в порядке, вы должны увидеть это в своем журнале:

Hibernate: удалить таблицу, если существует каскад пользователей Hibernate: создать таблицу пользователей (id_user varchar (255), не ноль, email varchar ( 255), имя_архии varchar (255), язык varchar (255), фамилия varchar (255), пароль varchar (255), rol varchar (255), первичный ключ (id_user))

Позвольте мне знаю.

0 голосов
/ 14 января 2020

Стратегия create-drop будет удалена после закрытия приложения. Вместо этого попробуйте create .

Рядом с этим: глядя на файл свойств:

spring:

datasource:
    url: jdbc:postgresql://localhost:5432/postgres
    username: postgres
    password: 1234
    driver-class-name: org.postgresql.Driver

  jpa:
    hibernate:
      ddl-auto: create-drop
    generate-ddl: true
    show-sql: true  

его отступ в некотором смысле выглядит так, как будто он не находит ваш jpa config, так как он вложен в источник данных.

try:

spring:

  datasource:
    url: jdbc:postgresql://localhost:5432/postgres
    username: postgres
    password: 1234
    driver-class-name: org.postgresql.Driver

  jpa:
    hibernate:
      ddl-auto: create-drop
    generate-ddl: true
    show-sql: true
    database-platform: org.hibernate.dialect.PostgreSQL9Dialect
      properties:
        hibernate:
          temp:
            use_jdbc_metadata_defaults: false
          jdbc:
            lob:
              non_contextual_creation: true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...