jpa 模式验证:漏桌[游戏]

3yhwsihp  于 2023-01-26  发布在  其他
关注(0)|答案(7)|浏览(129)

我认为这可能是复制品:Schema-validation: missing table [hibernate_sequences]但我想不出来。
在我的application.properties文件中,我有这个选项:spring.jpa.hibernate.ddl-auto=validate,我收到此错误:
Schema-validation: missing table [game]
为什么我会收到这个?
下面是我的Game类和User类:
游戏:

@Entity
public class Game {
    @Id
    @Column(name = "GAME_NUMBER")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long gameNumber;

    private int playerScore;
    private int NPCScore;
    private Date datetime;

    @ManyToOne
    @JoinColumn(name="USER_ID")
    private User user;

    public Game() {}

    public Game(int playerScore, int nPCScore, Date datetime) {
        super();
        this.playerScore = playerScore;
        this.NPCScore = nPCScore;
        this.datetime = datetime;
    }

    public User getUser() {
        return user;
    }
} + getters & setters

用户:

@Entity
public class User {
    @Id
    @Column(name = "USER_ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long userId;

    private String username;
    private String password;

    @OneToMany(mappedBy="user",cascade=CascadeType.ALL)
    private List<Game> games;

    @ElementCollection
    private List<Date> startSessions;

    public User() {}

    public User(String username, String password, List<Game> games, List<Date> startSessions) {
        super();
        this.username = username;
        this.password = password;
        this.games = games;
        this.startSessions = startSessions;
    }
}
0dxa2lsx

0dxa2lsx1#

validate验证实体是否与目标兼容,在某种程度上,这并不是万无一失的,无论您尝试验证的数据库是什么,它都没有一个名为game的表来存储实体。
这个答案更详细地说明了validate的作用。
Hibernate - hibernate.hbm2ddl.auto = validate
具体而言,
检查表、列、ID生成器是否存在
在不知道您的数据库/期望(您期望创建数据库,还是使用Flyway/Liquibase创建/更新数据库等)的情况下,我无法回答validate是否适合您的用例。
您可以尝试使用create-drop在启动/关闭时创建和删除表,但这不是对数据库进行生产控制的解决方案。

ogsagwnx

ogsagwnx2#

我得到的结果和我改用Hibernate 5.4.0.Final时一样。要么是Hibernate突然出现识别默认模式的问题,要么是驱动程序没有正确返回模式。我可以通过将模式定义添加到表定义中来绕过它。

@Table(name = "GAME", schema = "PUBLIC")

或者通过在persistence.xml中添加默认模式。

<property name="hibernate.default_schema" value="PUBLIC" />
siv3szwd

siv3szwd3#

不要忘记权限:GRANT选择、插入、更新、删除、更改ON表名TO用户名;

olqngx59

olqngx594#

在flywayDB中使用spring Boot 时可能会出现此错误。此问题可能是由于flywayDB使用的脚本文件的命名约定错误所致。
https://flywaydb.org/documentation/migrations#naming

wlzqhblo

wlzqhblo5#

SQL标准要求名称以大写形式存储,如果您以小写形式命名表/字段- JPA可以自动将大小写转换为大写,并尝试在这种情况下搜索名称,但以小写形式¯\_(ツ)_/¯写入日志

kuuvgm7e

kuuvgm7e6#

在application.yml中添加此内容:

spring:
  jpa:
    properties:
      hibernate:
        default_schema: game
ckx4rj1h

ckx4rj1h7#

Hibernate版本5.6.9,区分大小写的实现:

hibernate:
        physical_naming_strategy: 'org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl'

相关问题