【问题标题】:Schema-validation: wrong column type encountered in column [*] in table [*]; found [*], but expecting [*]模式验证:在表 [*] 的列 [*] 中遇到错误的列类型;找到 [*],但期待 [*]
【发布时间】:2017-04-14 12:52:48
【问题描述】:

Spring Boot JPA映射MySQL文本类型列,启动控制台时打印异常。

pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
    <relativePath />
</parent>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Brixton.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

实体:

 @Column(name = "description", nullable = false, length = 65535, columnDefinition="TEXT")
    @Type(type="org.hibernate.type.StringClobType")
    private String description;

控制台信息:

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [description] in table [kw_product]; found [text (Types#LONGVARCHAR)], but expecting [varchar(255) (Types#VARCHAR)]
    at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateColumnType(SchemaValidatorImpl.java:105) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:92) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.tool.schema.internal.SchemaValidatorImpl.doValidation(SchemaValidatorImpl.java:50) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:91) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:475) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
    ... 21 common frames omitted

【问题讨论】:

  • 如错误中所述,休眠预期[varchar(255) (Types#VARCHAR)] 用于description 列,但如果找到[text (Types#LONGVARCHAR)],您必须更改数据库中的列类型。
  • 我有同样的错误,奇怪的是在数据库中我的列是“varchar(max)”,但错误仍然显示“longvarchar”被发现。是不是错了?此外,如果我在“@Column”注释中将列定义指定为“VARCHAR(MAX) NULL”,则会发生相同的错误,只是它说它需要“varchar(max)”而不是“varchar(255)”。

标签: java mysql hibernate jpa spring-boot


【解决方案1】:

我修改 org.hibernate.tool.schema.internal.SchemaValidatorImpl 方法 validateColumnType 添加代码:

        String columnInfoType = columnInformation.getTypeName().toLowerCase(Locale.ROOT);
    if("text".equals(columnInfoType)) {
        return;
    }

【讨论】:

  • 针对错误情况的无操作似乎是一个糟糕的解决方案。
【解决方案2】:

根据this info,您应该将@Type 注释替换为@javax.persistence.Lob,它应该可以工作。

【讨论】:

  • 这为我的问题提供了正确的解决方案。我只是使用以下作为我的注释 @Lob @Type(type = "org.hibernate.type.TextType") @Column(name = "description")
猜你喜欢
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2011-08-24
  • 2021-08-09
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2017-04-21
相关资源
最近更新 更多