【问题标题】:convert String to Clob and vice versa in Hibernate在 Hibernate 中将 String 转换为 Clob,反之亦然
【发布时间】:2013-05-20 02:37:05
【问题描述】:

假设我有一个类:

class EventTransaction {
    .....
    private Clob dataXML;

    public Clob getDataXML() {
       return dataXML;
    }

    public void setDataXML(Clob dataXML) {
       this.dataXML = dataXML;
    }
}

和Hibernate映射xml:

 <property name="dataXML" type="java.sql.Clob">
        <column name="XML" sql-type="CLOB"/>
 </property>

在 java 代码中,如何将 String 转换为 Clob,反之亦然以保存到数据库中:

Ex: EventTransaction et = new EventTransaction();
    String xml = "fdfsafafafa";
    et.setDataXML(convertStringToClob(xml));
    HibernateTemplate.saveOrUpdate(et);

能否请您帮忙实现函数convertStringToClob(String data);

谢谢,

【问题讨论】:

  • 我在等待你的接受!

标签: string hibernate clob


【解决方案1】:

这样做

@Column(name='xml')
@Lob
private String dataXML;

public String getDataXML() {
   return dataXML;
}

public void setDataXML(String dataXML) {
   this.dataXML = dataXML;
}

所以不需要转换,一切由Hibernate完成。

我使用注解来展示它,同样的事情可以使用.hbm.xml 文件来完成。

【讨论】:

  • 如果我们这样做,我们将遇到 64k 限制的问题。我想保存一个更大的 xml 文件,比如字符串
  • 谁限制你到 64k?
  • 哇,嗯...你刚刚为我节省了大约 20 行代码、一个用于“de-clob-ed Strings”的缓存和一个序列化的解决方法...只是告诉你你应该在使用它们之前了解你的工具(休眠)。谢谢!
  • 64k是数据库的限制,在DB中选择合适的类型就没有限制了!
  • 我见过的最干净最简单的。谢谢老兄!
【解决方案2】:

这是我很久以前将 Clob 转换为字符串的代码。它旨在用于实用程序类。

    public static String convertClobToString(Clob clob) throws IOException, SQLException {
            Reader reader = clob.getCharacterStream();
            int c = -1;
            StringBuilder sb = new StringBuilder();
            while((c = reader.read()) != -1) {
                 sb.append(((char)c));
            }

            return sb.toString();
     }

如果我没记错的话,要创建一个 Clob,你会做这样的事情

     Clob myClobFile = new SerialClob("my string".toCharArray());

【讨论】:

  • java.lang.ClassCastException: javax.sql.rowset.serial.SerialClob 无法转换为 oracle.sql.CLOB
  • 我得到这个异常:java.lang.ClassCastException: javax.sql.rowset.serial.SerialClob 不能转换为 oracle.sql.CLOB
  • 从 java.sql.Clob 导入 Clob 接口,另一个应该是 javax.sql.rowset.serial.SerialClob。就我个人而言,我从来不需要在休眠中使用它,我使用了@Lob 注释,并在我的表上将该列声明为 CLOB。
  • 如果我这样做,我无法保存一个大的 XML 字符串,我们无法保存长度 > 64000 个字符的字符串
  • @hoangnguyen 你的数据库是什么?我有使用 Oracle 的经验,我知道在 Oracle 中将列类型声明为 CLOB 时没有这样的限制。
【解决方案3】:

当您将 XML 列声明为 VARCHAR(而不是 Java String)时,64000 个字符的限制在数据库端,因此只要您的列 XML 是 CLOB,它应该可以工作。

摘自工作代码:

实体:

private String xml;

SQL (ORACLE):

XML       CLOB,

休眠映射:

<property name="xml" type="java.lang.String">
    <column name="XML" length="999999" />
</property>

如果您想将 XML 存储为文件,那么您应该使用如下所示的 BLOB:

实体:

private byte[] xmlFile;

SQL (ORACLE):

XML       BLOB,

休眠映射:

<property name="xmlFile" type="java.io.File">
    <column name="XML" />
</property>

【讨论】:

  • 我声明 XML 列是 CLOB。问题仍然存在。
  • 尝试将类中的 dataXML 字段声明为字符串(而不是 Clob);相应地更改 XML 映射。在上面的代码 sn-p 中(从工作代码中提取)使用 String 而不是 Java 端的 Clob
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
相关资源
最近更新 更多