2

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)

那么为什么会有不同的“发现”呢?从谁那里“找到”这个信息?

4

2 回答 2

0

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

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

于 2018-11-08T19:18:17.120 回答
0

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

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

@Column(name = "FehlerLevel", nullable = false, columnDefinition = "text")
public String getFehlerLevel() {
于 2018-11-09T10:17:49.637 回答