Hibernate - NClob属性

时间:2012-02-08 11:23:13

标签: java hibernate jpa

这是我的实体:

public class MyEntity {
   @javax.persistence.Lob
   java.sql.NClob prop;

   public void setProp(java.sql.NClob c) {
       prop=c;
   }

   public java.sql.NClob getProp() {
       return prop;
   }
}

什么时候将它刷新到数据库,我得到了这个例外:

java.lang.ClassCastException: oracle.sql.NCLOB cannot be cast to java.sql.Blob 
 at org.hibernate.type.BlobType.getReplacement(BlobType.java:37) 
 at org.hibernate.type.AbstractStandardBasicType.replace(AbstractStandardBasicType.java:359) 
 at org.hibernate.type.TypeHelper.replace(TypeHelper.java:212) 
 at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:600) 
 at org.hibernate.event.def.DefaultMergeEventListener.mergeTransientEntity(DefaultMergeEventListener.java:337) 
 at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:303) 
 at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:464) 
 at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:255) 
 at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:84) 
 at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:867) 
 at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:851) 
 at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:855) 
 at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:851)

为什么Hibernate会尝试将其强制转换为java.sql.Blob? 我可以指定另一种类型而不是java.sql.Blob(java.sql.Clob)吗?

JDK 6
JPA 2
Hibernate 3.6.8.Final
Oracle 10.2g
Postgresql 8.3 (从Oracle数据库中读取实体,然后写入Postgresql数据库)

我已在此on JIRA

上打开了一个错误

2 个答案:

答案 0 :(得分:1)

我建议使用String类型而不是NClob,无论如何你可以尝试用以下代码替换@Lob注释:

@Column(columnDefinition="LONGTEXT")

看看是否有帮助。

答案 1 :(得分:1)

这是我如何解决我的问题:

public class MyEntity {
   @Column(length=100000)
   String prop;

   public void setProp(String c) {
       prop=c;
   }

   public String getProp() {
       return prop;
   }
}

在我的情况下,任意值100000足以处理应用程序将处理的值。