似乎Hibernate开始LONG在3.5.5版(我们从3.2.7升级)中使用数据类型,而不是CLOB使用的属性type="text"。
LONG
CLOB
type="text"
这是造成问题,因为LONG在Oracle数据类型是一个古老的过时的数据类型(参见http://www.orafaq.com/wiki/LONG不应被使用),以及表不能具有一个以上的列LONG作为数据类型。
有谁知道为什么改变了?
我尝试将Oracle SetBigStringTryClob属性设置为true(如[Hibernate>CLOB>Oracle所建议),但这不会影响数据类型映射,而只会影响与我的情况无关的数据传输内部。
SetBigStringTryClob
一种可能的解决方案是覆盖org.hibernate.dialect.Oracle9iDialect:
org.hibernate.dialect.Oracle9iDialect
public class Oracle9iDialectFix extends Oracle9iDialect { public Oracle9iDialectFix() { super(); registerColumnType(Types.LONGVARCHAR, "clob"); registerColumnType(Types.LONGNVARCHAR, "clob"); } }
但是,这是不得已的方法-重写此类比向Hibernate派生更近一步,我宁愿避免这样做。
谁能解释为什么这样做?是否应该将其作为错误提出?
[更新]:我已经创建了https://hibernate.atlassian.net/browse/HHH-5569,让我们看看会发生什么。
看来该问题的解决方案正在使用materialized_clob,至少这是盖尔·巴德纳(Gail Badner)在HHH-5569上所说的。
materialized_clob
这根本没有帮助我(我对此发表了评论),但可能对这里的其他人有所帮助。无论如何,该错误都会被拒绝,对此我几乎无能为力,只能使用覆盖的方言:(