首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate模式验证\ MS varchar(max) \ MS 2008

Hibernate模式验证\ MS varchar(max) \ MS 2008
EN

Stack Overflow用户
提问于 2018-11-07 10:08:36
回答 2查看 1.6K关注 0票数 2

JPA/Hibernate和现有的MS 2008数据库有问题,该数据库有一个列定义为"varchar(max)“的表。

关于varchar的MS (n=max)额外的堆栈线程--见答案

从MSSQL2008Server复制的列定义:屏幕截图

Hbm2java生成的实体:

代码语言:javascript
复制
@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.结束
  • hibernate.validator 6.0.9最后
  • hibernate.validator.cdi 6.0.9最后
  • hibernate.jpa.2.1.api 1.0.2.Final

案例1:

代码语言:javascript
复制
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />

本地开发机器= OK

Testserver (catalina loghost...log) =

模式-验证:在表日志中的列FehlerLevel中遇到错误的列类型;找到文本(Types#LONGVARCHAR),但期望varchar(255) (Types#VARCHAR)

案例2:

代码语言:javascript
复制
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />

本地开发机器= OK

Testserver (catalina loghost...log) =

模式-验证:在表日志中的列FehlerLevel中遇到错误的列类型;找到文本(Types#LONGVARCHAR),但期望varchar(255) (Types#VARCHAR)

案例3:

更改实体,添加@Lob

代码语言:javascript
复制
    @Lob
    @Column(name = "FehlerLevel", nullable = false)
    public String getFehlerLevel() {

首先(如案例2):

代码语言:javascript
复制
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />

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

模式验证:在表日志中的列FehlerLevel中遇到错误的列类型;找到varchar (Types#VARCHAR),但期望文本(Types#CLOB)

Testserver = OK

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

案例4:

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

代码语言:javascript
复制
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />

本地开发机器= OK

Testserver (catalina loghost...log) =

模式验证:在表日志中的列FehlerLevel中遇到错误的列类型;找到文本(Types#LONGVARCHAR),但期望varchar(max) (Types#CLOB)

__________ 现在它再次在本地机器上运行,而不是在testserver上运行。

这是怎么回事?

我的问题有什么解决办法?

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

还有..。请有人解释一下模式验证包括了什么吗?哪些库(hibernate、db驱动程序等)被感动了吗?

如果验证失败,则消息中的差异:

查找varchar (Types#VARCHAR) -本地机器-(案例3)

找到文本(Types#LONGVARCHAR) -测试服务器-(案例1、2、4)

那么,为什么会有不同的“创建”呢?从谁那里得到了这个“发现”的信息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-08 19:18:17

将columnDefinition = "TEXT“添加到@列描述符中是否纠正了这个问题?在我看来,数据库类型是文本,Hibernate默认为255长度字符串。听起来,本地计算机和测试服务器之间的数据库列也不完全相同。

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

票数 0
EN

Stack Overflow用户

发布于 2018-11-09 10:17:49

由于用户"UnhandledExcepSean",解决方案是:

代码语言:javascript
复制
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />

代码语言:javascript
复制
@Column(name = "FehlerLevel", nullable = false, columnDefinition = "text")
public String getFehlerLevel() {
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53187303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档