带休眠功能的 Quarkus 发现 [bpchar (Types#CHAR)],但期待 [char (Types#VARCHAR)]

Quarkus with hibernate found [bpchar (Types#CHAR)], but expecting [char (Types#VARCHAR)]

你好,我正在尝试使用 Hibernate 学习 Quarkus,但我 运行 遇到了模式验证问题。

错误:

2021-12-29 16:05:14,915 ERROR [io.qua.hib.orm.run.sch.SchemaManagementIntegrator] (Hibernate post-boot validation thread for ) Failed to validate Schema: Schema-validation: wrong column type encount ered in column [BED_INFO] in table [ROOM]; found [bpchar (Types#CHAR)], but expecting [char (Types#VARCHAR)] 2021-12-29 16:05:14,921 ERROR [io.qua.hib.orm.run.sch.SchemaManagementIntegrator] (Hibernate post-boot validation thread for ) The following SQL may resolve the database issues, as generated by the Hibernate schema migration tool. WARNING: You must manually verify this SQL is correct, this is a best effort guess, do not copy/paste it without verifying that it does what you expect.

class 房间看起来像这样

@Entity
@Table(name = "ROOM")
public class Room {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ROOM_ID")
    private long id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "ROOM_NUMBER")
    private String roomNumber;
    @Column(name = "BED_INFO", columnDefinition = "char")
    private String bedInfo;

    public Room(String name, String roomNumber, String bedInfo) {
        this.name = name;
        this.roomNumber = roomNumber;
        this.bedInfo = bedInfo;
    }

}

和这样的 mysql 模式

CREATE TABLE ROOM(
  ROOM_ID BIGSERIAL PRIMARY KEY,
  NAME VARCHAR(16) NOT NULL,
  ROOM_NUMBER CHAR(2) NOT NULL UNIQUE,
  BED_INFO CHAR(2) NOT NULL
);

根据他们的文档,这个“应该”有效,但我可能在这里遗漏了一些东西。

[BED_INFO] in table [ROOM]; found [bpchar (Types#CHAR)], but expecting [char (Types#VARCHAR)]

意味着 Hibernate 已经找到了一个 bpchar(char),它应该是一个 varchar。 columnDefinition 似乎没有处理 char。如果您真的希望它成为 char,请尝试 bpchar

如果它不起作用,请在 application.properties 文件中使用此选项在开发模式下尝试 运行 您的 quarkus 应用程序。

quarkus.hibernate-orm.database.generation=create

这将为您的数据库生成 Hibernate 期望的实际 DDL。

就我个人而言,我会避免使用 columnDefinition,而是使用 lengthnullable。除非你在现有的基础上构建应用程序,否则我也会删除 name@Table.