JPA/Hibernate 和现有的 MS-SQL 2008 数据库存在问题,该数据库具有定义为“varchar(max)”的列的表。
关于 varchar(n|max)和附加堆栈线程的 MS Docs - 查看答案
从 MS SQL 2008 Server 复制的列定义: 屏幕截图
hbm2java 生成的实体:
@Entity
@Table(name = "Log")
public class Log implements java.io.Serializable {
private String fehlerLevel;
@Column(name = "FehlerLevel", nullable = false)
public String getFehlerLevel() {
使用的库:
Tomcat 8.5
休眠 5.2.17.Final
hibernate.validator 6.0.9.Final
hibernate.validator.cdi 6.0.9.Final
hibernate.jpa.2.1.api 1.0.2.Final
情况1:
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />
本地开发者机器 = OK
测试服务器 (catalina loghost...log) =
Schema-validation:在表 [Log] 的 [FehlerLevel] 列中遇到错误的列类型;找到 [text (Types#LONGVARCHAR)],但期望 [varchar(255) (Types#VARCHAR)]
案例二:
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
本地开发者机器 = OK
测试服务器 (catalina loghost...log) =
Schema-validation:在表 [Log] 的 [FehlerLevel] 列中遇到错误的列类型;找到 [text (Types#LONGVARCHAR)],但期望 [varchar(255) (Types#VARCHAR)]
案例3:
更改了实体,添加了@Lob
@Lob
@Column(name = "FehlerLevel", nullable = false)
public String getFehlerLevel() {
从(如案例2)开始:
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
本地开发者机器(控制台输出)=
Schema-validation:在表 [Log] 的 [FehlerLevel] 列中遇到错误的列类型;找到 [varchar (Types#VARCHAR)],但期待 [text (Types#CLOB)]
测试服务器 = 好的
__________现在它在测试服务器上运行,但不在我的本地机器上。
案例4:
带有 @Lob 和 2008 方言的实体(如案例 1)::
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />
本地开发者机器 = OK
测试服务器 (catalina loghost...log) =
Schema-validation:在表 [Log] 的 [FehlerLevel] 列中遇到错误的列类型;找到 [text (Types#LONGVARCHAR)],但期待 [varchar(max) (Types#CLOB)]
__________现在它再次在我的本地机器上运行,但又不在 testserver 上
这里发生了什么?
我的问题的解决方案是什么?
所有库都将打包在 war 文件中,并在服务器上的“app\WEB-INF\lib”文件夹中可用。我们的 tomcat 管理员告诉我他们没有限制,所以应用程序可以使用他们自己的库。这意味着我的本地机器和服务器之间应该没有区别。我们已经检查过,两者都使用相同的数据库。
而且......有人可以解释一下模式验证所做的/包含的内容吗?涉及哪些库(hibernate、db-driver 等)?
验证失败时消息的差异:
found [varchar (Types#VARCHAR)] --- local machine - (case 3)
found [text (Types#LONGVARCHAR)] --- testserver - (case 1, 2, 4)
那么为什么会有不同的“发现”呢?从谁那里“找到”这个信息?