【问题标题】:Hibernate - NClob property休眠 - NClob 属性
【发布时间】:2012-02-08 11:23:13
【问题描述】:

这是我的实体:

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 上打开了一个错误

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

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

    @Column(columnDefinition="LONGTEXT")
    

    看看有没有帮助。

    【讨论】:

    • 这个解决方案很好,但特定于数据库供应商。
    【解决方案2】:

    我如何解决我的问题:

    public class MyEntity {
       @Column(length=100000)
       String prop;
    
       public void setProp(String c) {
           prop=c;
       }
    
       public String getProp() {
           return prop;
       }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2013-01-07
      • 2010-09-20
      • 2021-09-03
      • 2016-02-26
      • 2012-08-07
      相关资源
      最近更新 更多