Hibernate 模式验证 | MS SQL varchar(最大) |女士 SQL 2008

Hibernate schema validation | MS SQL varchar(max) | MS SQL 2008

JPA/Hibernate 和现有的 MS-SQL 2008 数据库有问题,该数据库的 table 列定义为 "varchar(max)"。

MS Docs about varchar(n|max) and additional Stack thread - see the answer

从 MS SQL 2008 服务器复制的列定义: screenshot

hbm2java生成的实体:

@Entity
@Table(name = "Log")
public class Log implements java.io.Serializable {

    private String fehlerLevel;

    @Column(name = "FehlerLevel", nullable = false)
    public String getFehlerLevel() {

使用的库:

案例一:

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />

本地开发机器 = OK

测试服务器(catalina loghost...日志)=

Schema-validation: wrong column type encountered in column [FehlerLevel] in table [Log]; found [text (Types#LONGVARCHAR)], but expecting [varchar(255) (Types#VARCHAR)]

案例二:

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />

本地开发机器 = OK

测试服务器(catalina loghost...日志)=

Schema-validation: wrong column type encountered in column [FehlerLevel] in table [Log]; found [text (Types#LONGVARCHAR)], but expecting [varchar(255) (Types#VARCHAR)]

案例三:

更改实体,添加@Lob

    @Lob
    @Column(name = "FehlerLevel", nullable = false)
    public String getFehlerLevel() {

开始于(如案例 2):

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />

本地开发机器(控制台输出)=

Schema-validation: wrong column type encountered in column [FehlerLevel] in table [Log]; found [varchar (Types#VARCHAR)], but expecting [text (Types#CLOB)]

测试服务器 = 正常

__________现在它可以在测试服务器上运行,但不能在我的本地机器上运行。

案例四:

带有@Lob 和 2008 方言的实体(如案例 1)::

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />

本地开发机器 = OK

测试服务器(catalina loghost...日志)=

Schema-validation: wrong column type encountered in column [FehlerLevel] in table [Log]; found [text (Types#LONGVARCHAR)], but expecting [varchar(max) (Types#CLOB)]

__________ 现在它再次在我的本地机器上运行,而不是在测试服务器上再次运行

这是怎么回事?

我的问题的解决方案是什么?

所有库都将打包在 war 文件中,并且在服务器上的 "app\WEB-INF\lib" 文件夹中可用。我们的 tomcat 管理员告诉我他们没有限制,所以应用程序可以使用他们自己的库。这意味着我的本地机器和服务器之间应该没有区别。我们已经检查过,两者使用相同的数据库。

而且...有人可以通过模式验证解释什么是 done/included 吗?接触了哪些库(hibernate、db-driver 等)?

验证失败消息差异:
找到 [varchar (Types#VARCHAR)] --- 本地机器 - (案例 3)
找到 [text (Types#LONGVARCHAR)] --- testserver - (case 1, 2, 4)

那么为什么会有不同的 "founds"?从谁那里得到休眠这个信息 "found"?

将 columnDefinition = "TEXT" 添加到 @Column 描述符是否可以解决问题?在我看来,数据库类型是 TEXT,Hibernate 默认为 255 长度的字符串。听起来您的本地计算机和测试服务器之间的数据库列也不相同。

https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/Column.html

感谢用户"UnhandledExcepSean",解决方案是:

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />

@Column(name = "FehlerLevel", nullable = false, columnDefinition = "text")
public String getFehlerLevel() {