使用 Hibernate 在 HSQL 中更改 table 时不兼容的数据类型

Incompatible data types while ALTER table in HSQL with Hibernate

如何修复下一个错误?

错误 SchemaExport:484 - HHH000389:不成功:改变 table CATEGORY_RELATIONS 添加约束 FK2bn4xlg661b5xbx2qnwi1aqv0 外键 (CATEGORY_RELATIONS_PARENT_ID) 引用类别 错误 SchemaExport:485 - 语句组合中的不兼容数据类型 [alter table CATEGORY_RELATIONS 添加约束 FK2bn4xlg661b5xbx2qnwi1aqv0 外键 (CATEGORY_RELATIONS_PARENT_ID) 引用 CATEGORY]

hibernate.version 5.0.7.Final

hsqldb.version 2.3.3

属性,用于会话工厂

hibernate.dialect=org.hibernate.dialect.HSQLDialect

类别

@Entity
@Table(name = "CATEGORY",
        indexes = {
                @Index(name = "CATEGORY_NAME_INDEX",
                        columnList = "CATEGORY_NAME")})
public class Category extends JsonNamedModel {
    @Id
    @Column(name = "CATEGORY_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Column(name = "CATEGORY_NAME")
    private String name;
    @Column(name = "CATEGORY_IMAGE")
    private String image;
    @OneToOne(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
    @JoinTable(name = "CATEGORY_RELATIONS",
            joinColumns = {
                    @JoinColumn(name = "CATEGORY_RELATIONS_CATEGORY_ID", referencedColumnName = "CATEGORY_ID")},
            inverseJoinColumns = {
                    @JoinColumn(name = "CATEGORY_RELATIONS_PARENT_ID", referencedColumnName = "CATEGORY_ID")})
    private Category parent;
    @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER, mappedBy = "parent")
    private List<Category> children;//...
}

类别关系

@Entity
@Table(name = "CATEGORY_RELATIONS")
@IdClass(CategoryRelations.CategoryRelationsPrimaryKey.class)
public class CategoryRelations implements Serializable {
    @Id
    @Column(name = "CATEGORY_RELATIONS_CATEGORY_ID")
    private String categoryId;
    @Id
    @Column(name = "CATEGORY_RELATIONS_PARENT_ID")
    private String parentId;

    @Entity
    @IdClass(CategoryRelationsPrimaryKey.class)
    public static class CategoryRelationsPrimaryKey implements Serializable {
        private long categoryId;
        private long parentId;
    }//...
}

我认为这是在抱怨,因为您的类型不匹配。在 CATEGORY_RELATIONS 中,您的键类型为 String,但在 CATEGORY 中,您的主键类型为 int。虽然在实际实践中您可能只在两个字段中存储整数数据,但数据库引擎无法证明这一点。没有什么能阻止某人在 CATEGORY_RELATIONS.categoryId 中放入一个非整数并使其成为永远无法满足的 FK。

尝试将 CATEGORY_RELATIONS.categoryId 更改为整数。

现在我看了一下,你的 PK class 显示它们是多头。尝试将 CategoryRelations 对象(可能 CATEGORY_RELATIONS table)中的所有类型都切换为相同类型。