【问题标题】:Schema-validation: missing table [game]模式验证:缺少表 [游戏]
【发布时间】:2017-11-12 17:56:18
【问题描述】:

我认为这可能是重复的: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;
    }
}

【问题讨论】:

    标签: jpa spring-boot


    【解决方案1】:

    validate 验证实体与目标兼容,在某种程度上它不是万无一失的。无论如何,无论您尝试验证的哪个数据库都没有一个名为 game 的表来存储实体。

    这个答案更详细地说明了 validate 的作用。

    Hibernate - hibernate.hbm2ddl.auto = validate

    具体来说,

    检查表、列、id 生成器是否存在

    在不知道您的数据库/期望的情况下(您是否期望它被创建,或者使用 Flyway/Liquibase 来创建/更新数据库等)我无法回答 validate 是否适合您的用例。

    您可以尝试create-drop 在启动/关闭时创建和删除表,但这不是对数据库进行任何生产控制的解决方案。

    【讨论】:

    • 我解决了问题并创建了表 [游戏],现在它可以正常工作了。
    【解决方案2】:

    当我更改为 Hibernate 5.4.0.Final 时,我得到了相同的结果。 Hibernate 突然无法识别默认模式,或者驱动程序没有正确返回模式。 我可以通过将模式定义添加到表定义来绕过它。

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

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

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

    【讨论】:

    • 帮助我将hibernate.default_schema 设置为具有适当值的系统属性
    • @Bevor - 很好,但是如果我设置的不是 PUBLIC,比如 BATCH,那么它会给出同样的错误。有什么理由吗?
    • @Ash_P 不知道,抱歉。 BATCH 是否存在?
    【解决方案3】:

    使用 spring boot 和 flywayDB 时可能会出现此错误。 该问题可能是由于 flywayDB 使用的脚本文件命名约定错误所致。

    https://flywaydb.org/documentation/migrations#naming

    【讨论】:

      【解决方案4】:

      不要忘记权限: GRANT select, insert, update, delete, alter ON table_name TO usr_name;

      【讨论】:

      • 为我解决了。似乎 JPA 没有明确告诉您您没有权限。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2017-02-02
        • 2019-01-20
        • 2018-01-21
        • 2021-09-14
        • 1970-01-01
        • 2022-01-01
        • 2019-09-29
        • 2018-07-21
        相关资源
        最近更新 更多