convert String to Clob and vice versa in Hibernate

2019-02-13 00:03发布

问题:

Suppose that I have a Class:

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

    public Clob getDataXML() {
       return dataXML;
    }

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

And Hibernate mapping xml:

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

In java code, how to I convert a String to Clob and vice versa to save into to the database:

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

Could you please help how to implement function convertStringToClob(String data);

Thanks,

回答1:

Do this

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

public String getDataXML() {
   return dataXML;
}

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

So there is no need to convert, and everything is done by Hibernate.

I showed it using annotations, the same thing can be done using .hbm.xml files.



回答2:

Here is code I made a long time ago to convert a Clob to a String. It's meant to be used in a utility class.

    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();
     }

And if I am not mistaken, to create a Clob you would do something like this

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


回答3:

The limitation of 64000 characters is on the database side when you declare the XML column as VARCHAR (and not on Java String), so as long as your column XML is a CLOB, it should work.

Excerpt from working code:

Entity:

private String xml;

SQL (ORACLE):

XML       CLOB,

Hibernate mapping:

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

If you want to store the XML as a file, then you should rather use BLOBs as shown below :

Entity:

private byte[] xmlFile;

SQL (ORACLE):

XML       BLOB,

Hibernate mapping:

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