【问题标题】:JPA and Spring Boot not generating DB tablesJPA 和 Spring Boot 不生成数据库表
【发布时间】:2021-02-12 15:03:45
【问题描述】:

我正在使用 Spring Boot 2.4.2 和 JPA 在现有数据库中生成表。 Maven构建项目没有任何问题,当我启动spring boot时,也没有错误,但同时没有创建表。

这是我的 pom.xml:

<dependencies>

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

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

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

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

</dependencies>

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

application.properties:

spring.datasource.url=jdbc:postgresql://localhost:5433/tiktaktoe

spring.datasource.username=postgres

spring.datasource.password=****

spring.jpa.generate-ddl=true

我的课程:

package by.egerag.tiktaktoe.entity;

import javax.persistence.*;
import java.util.List;

@Entity
public class Player {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String username;

    private String password;

    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
            name = "role",
            joinColumns = { @JoinColumn(name = "player_id") },
            inverseJoinColumns = { @JoinColumn(name = "role_id") }
    )
    private List<Role> role;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "statistics_id", referencedColumnName = "id")
    private Statistics statistics;

    @OneToMany(mappedBy = "firstPlayer", cascade = CascadeType.ALL)
    private List<Lobby> firstLobby;

    @OneToMany(mappedBy = "secondPlayer", cascade = CascadeType.ALL)
    private List<Lobby> secondLobby;

    public Player() {
    }

    public Player(Integer id, String username, String password, List<Role> role, Statistics statistics) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.role = role;
        this.statistics = statistics;
    }

    public Player(String username, String password, List<Role> role, Statistics statistics) {
        this.username = username;
        this.password = password;
        this.role = role;
        this.statistics = statistics;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Role> getRole() {
        return role;
    }

    public void setRole(List<Role> rights) {
        this.role = rights;
    }

    public Statistics getStatistics() {
        return statistics;
    }

    public void setStatistics(Statistics statistics) {
        this.statistics = statistics;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", rights=" + role +
                ", statistics=" + statistics +
                '}';
    }
}


package by.egerag.tiktaktoe.entity;

import javax.persistence.*;
import java.util.List;

@Entity
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String role;

    @ManyToMany(mappedBy = "role")
    private List<Player> players;

    public Role() {
    }

    public Role(String role) {
        this.role = role;
    }

    public Role(Integer id, String role) {
        this.id = id;
        this.role = role;
    }

    public Role(Integer id, String role, List<Player> players) {
        this.id = id;
        this.role = role;
        this.players = players;
    }

    public Integer getId() {
        return id;
    }

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

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public List<Player> getPlayers() {
        return players;
    }

    public void setPlayers(List<Player> players) {
        this.players = players;
    }

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", role='" + role + '\'' +
                ", users=" + players +
                '}';
    }
}


package by.egerag.tiktaktoe.entity;

import javax.persistence.*;

@Entity
public class Statistics {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private Integer win;

    private Integer loose;

    @OneToOne(mappedBy = "statistics")
    private Player player;

    public Statistics() {
    }

    public Statistics(Integer win, Integer loose) {
        this.win = win;
        this.loose = loose;
    }

    public Statistics(Integer id, Integer win, Integer loose) {
        this.id = id;
        this.win = win;
        this.loose = loose;
    }

    public Integer getId() {
        return id;
    }

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

    public Integer getWin() {
        return win;
    }

    public void setWin(Integer win) {
        this.win = win;
    }

    public Integer getLoose() {
        return loose;
    }

    public void setLoose(Integer loose) {
        this.loose = loose;
    }

    @Override
    public String toString() {
        return "Statistics{" +
                "id=" + id +
                ", win=" + win +
                ", loose=" + loose +
                '}';
    }
}



package by.egerag.tiktaktoe.entity;

import javax.persistence.*;

@Entity
public class Lobby {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "firstPlayer_id", referencedColumnName = "id")
    private Player firstPlayer;

    @ManyToOne
    @JoinColumn(name = "secondPlayer_id", referencedColumnName = "id")
    private Player secondPlayer;

    private Integer turn;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "battlefield_id", referencedColumnName = "id")
    private Battlefield battlefield;

    public Lobby() {
    }

    public Lobby(Player firstPlayer, Player secondPlayer, Integer turn, Battlefield battlefield) {
        this.firstPlayer = firstPlayer;
        this.secondPlayer = secondPlayer;
        this.turn = turn;
        this.battlefield = battlefield;
    }

    public Lobby(Integer id, Player firstPlayer, Player secondPlayer, Integer turn, Battlefield battlefield) {
        this.id = id;
        this.firstPlayer = firstPlayer;
        this.secondPlayer = secondPlayer;
        this.turn = turn;
        this.battlefield = battlefield;
    }

    public Integer getId() {
        return id;
    }

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

    public Player getFirstPlayer() {
        return firstPlayer;
    }

    public void setFirstPlayer(Player firstPlayer) {
        this.firstPlayer = firstPlayer;
    }

    public Player getSecondPlayer() {
        return secondPlayer;
    }

    public void setSecondPlayer(Player secondPlayer) {
        this.secondPlayer = secondPlayer;
    }

    public Integer getTurn() {
        return turn;
    }

    public void setTurn(Integer turn) {
        this.turn = turn;
    }

    public Battlefield getBattlefield() {
        return battlefield;
    }

    public void setBattlefield(Battlefield battlefield) {
        this.battlefield = battlefield;
    }

    @Override
    public String toString() {
        return "Lobby{" +
                "id=" + id +
                ", firstPlayer=" + firstPlayer +
                ", secondPlayer=" + secondPlayer +
                ", turn=" + turn +
                ", battlefield=" + battlefield +
                '}';
    }
}



package by.egerag.tiktaktoe.entity;

import javax.persistence.*;

@Entity
public class Battlefield {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private Integer x1y1;

    private Integer x2y1;

    private Integer x3y1;

    private Integer x1y2;

    private Integer x2y2;

    private Integer x3y2;

    private Integer x1y3;

    private Integer x2y3;

    private Integer x3y3;

    @OneToOne(mappedBy = "battlefield")
    private Lobby lobby;

    public Battlefield() {
    }

    public Battlefield(Integer x1y1, Integer x2y1, Integer x3y1,
                       Integer x1y2, Integer x2y2, Integer x3y2,
                       Integer x1y3, Integer x2y3, Integer x3y3) {
        this.x1y1 = x1y1;
        this.x2y1 = x2y1;
        this.x3y1 = x3y1;
        this.x1y2 = x1y2;
        this.x2y2 = x2y2;
        this.x3y2 = x3y2;
        this.x1y3 = x1y3;
        this.x2y3 = x2y3;
        this.x3y3 = x3y3;
    }

    public Battlefield(Integer id,
                       Integer x1y1, Integer x2y1, Integer x3y1,
                       Integer x1y2, Integer x2y2, Integer x3y2,
                       Integer x1y3, Integer x2y3, Integer x3y3) {
        this.id = id;
        this.x1y1 = x1y1;
        this.x2y1 = x2y1;
        this.x3y1 = x3y1;
        this.x1y2 = x1y2;
        this.x2y2 = x2y2;
        this.x3y2 = x3y2;
        this.x1y3 = x1y3;
        this.x2y3 = x2y3;
        this.x3y3 = x3y3;
    }

    public Integer getId() {
        return id;
    }

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

    public Integer getX1y1() {
        return x1y1;
    }

    public void setX1y1(Integer x1y1) {
        this.x1y1 = x1y1;
    }

    public Integer getX2y1() {
        return x2y1;
    }

    public void setX2y1(Integer x2y1) {
        this.x2y1 = x2y1;
    }

    public Integer getX3y1() {
        return x3y1;
    }

    public void setX3y1(Integer x3y1) {
        this.x3y1 = x3y1;
    }

    public Integer getX1y2() {
        return x1y2;
    }

    public void setX1y2(Integer x1y2) {
        this.x1y2 = x1y2;
    }

    public Integer getX2y2() {
        return x2y2;
    }

    public void setX2y2(Integer x2y2) {
        this.x2y2 = x2y2;
    }

    public Integer getX3y2() {
        return x3y2;
    }

    public void setX3y2(Integer x3y2) {
        this.x3y2 = x3y2;
    }

    public Integer getX1y3() {
        return x1y3;
    }

    public void setX1y3(Integer x1y3) {
        this.x1y3 = x1y3;
    }

    public Integer getX2y3() {
        return x2y3;
    }

    public void setX2y3(Integer x2y3) {
        this.x2y3 = x2y3;
    }

    public Integer getX3y3() {
        return x3y3;
    }

    public void setX3y3(Integer x3y3) {
        this.x3y3 = x3y3;
    }

    public Lobby getLobby() {
        return lobby;
    }

    public void setLobby(Lobby lobby) {
        this.lobby = lobby;
    }

    @Override
    public String toString() {
        return "Battlefield{" +
                "id=" + id +
                ", x1y1=" + x1y1 +
                ", x2y1=" + x2y1 +
                ", x3y1=" + x3y1 +
                ", x1y2=" + x1y2 +
                ", x2y2=" + x2y2 +
                ", x3y2=" + x3y2 +
                ", x1y3=" + x1y3 +
                ", x2y3=" + x2y3 +
                ", x3y3=" + x3y3 +
                '}';
    }
}

和 Spring Boot 日志:

2021-02-12 17:25:55.225  INFO 8148 --- [           main] b.egerag.tiktaktoe.TikTakToeApplication  : Starting TikTakToeApplication using Java 11.0.5 on DESKTOP-1RSAF53 with PID 8148 (D:\demo\TikTakToe\target\classes started by HP in D:\demo\TikTakToe)
2021-02-12 17:25:55.257  INFO 8148 --- [           main] b.egerag.tiktaktoe.TikTakToeApplication  : No active profile set, falling back to default profiles: default
2021-02-12 17:25:57.319  INFO 8148 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-02-12 17:25:57.435  INFO 8148 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 108 ms. Found 5 JPA repository interfaces.
2021-02-12 17:25:58.949  INFO 8148 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-02-12 17:25:58.969  INFO 8148 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-02-12 17:25:58.969  INFO 8148 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.41]
2021-02-12 17:25:59.282  INFO 8148 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-02-12 17:25:59.282  INFO 8148 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3732 ms
2021-02-12 17:25:59.537  INFO 8148 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2021-02-12 17:25:59.784  INFO 8148 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2021-02-12 17:25:59.864  INFO 8148 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-02-12 17:25:59.975  INFO 8148 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.27.Final
2021-02-12 17:26:00.288  INFO 8148 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-02-12 17:26:00.581  INFO 8148 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL10Dialect
2021-02-12 17:26:02.180  INFO 8148 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2021-02-12 17:26:02.195  INFO 8148 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-02-12 17:26:02.264  WARN 8148 --- [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-02-12 17:26:02.449  INFO 8148 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-02-12 17:26:03.345  INFO 8148 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-02-12 17:26:03.361  INFO 8148 --- [           main] b.egerag.tiktaktoe.TikTakToeApplication  : Started TikTakToeApplication in 9.544 seconds (JVM running for 13.661)

我检查了几乎所有类似的问题,但没有找到适合我的案例的解决方案。

【问题讨论】:

    标签: spring-boot jpa


    【解决方案1】:

    尝试将其添加到属性中:

    spring.jpa.hibernate.ddl-auto = update
    

    因为它默认为none

    还要添加这个,因为您使用的是 postgres:

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

    【讨论】:

    • 您好,两种方法都试过了,结果一样,没有创建表,可能类中的注解不正确?
    • 我认为注释是正确的。您可能还想尝试将其更改为 spring.jpa.hibernate.ddl-auto = create @Egerag
    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2019-09-14
    • 2020-02-06
    • 2014-10-21
    • 2017-08-22
    • 2019-10-13
    相关资源
    最近更新 更多