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

标签 java sql database hibernate hsqldb

如何修复下一个错误?

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

hibernate.version 5.0.7.Final

hsqldb.version 2.3.3

属性,用于 session 工厂

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 更改为 int。

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

关于java - 使用 Hibernate 在 HSQL 中更改表时不兼容的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36501800/

相关文章:

Mysql查询从同一个表中检索子数据和父数据

java - sql 查询中出现意外的 token 错误

php - 使用csv文件创建表到数据库mysql

java - 如何在 Spring Boot 应用程序中为 @Scheduled cron 作业编写集成测试?

java - 如何额外配置自动创建的 Spring Boot bean?

java - 在LWJGL中变换硬件光标

c# - 重写方法(返回类型 DBDataReader)并返回不同类型(SQLDBDataReader)

java - 尝试连接并发送 telnet 命令时出现 NPE

sql - 如何查询同一个表的子关系并正确排序

java - 如何关闭 EBean 增强