日期:2014-05-16 浏览次数:20600 次
?
前段时间工作中使用jpa做持久化,数据库使用informix,在映射大文本字段的时候出了一些问题,informix数据库用的人比较少,所以从网上查找相应的解决方法颇费了不少功夫,现在有空闲了,将解决方法整理了一下, 共享出来。
?
?
在持久化类里面使用如下方式映射大文本字段:
?
?
@Lob @Basic(fetch=FetchType.EAGER) @Column(name="result_content") public String getResultContent() { return resultContent; }?
?
从持久化类自动生成数据库表时报错了,错误的具体内容记不得了,反正说是映射大文本字段的时候出的错。于是就上网搜informix使用jpa怎么映射大文本字段。
?
从网上搜“informix hibernate 大文本”,搜出这么个东西来:
?
?
package org.hibernate.dialect; import java.sql.Types; /** * Dialect for Informix 10. * <ul> * <li>hint for first rows</li> * <li>support for limitOffset</li> * <li>added types for BLOB and CLOB</li> * </ul> */ public class Informix10Dialect extends InformixDialect { /** * */ public Informix10Dialect() { super(); registerColumnType( Types.BLOB, "blob" ); registerColumnType( Types.CLOB, "clob" ); } public boolean useMaxForLimit() { return false; } public boolean supportsLimitOffset() { return true; } public String getLimitString(String querySelect, int offset, int limit) { String os = ""; if (offset > 0) os = " skip " + offset; return new StringBuffer( querySelect.length() + 24 + os.length()) .append(querySelect) .insert( querySelect.toLowerCase().indexOf( "select" ) + 6, " {+ FIRST_ROWS }" + os + " first " + limit ) .toString(); } }?
?
该类扩展了hibernate自带的InformixDialect,提供了informix 10 的使用first和skip 进行分页查询,
并添加了clob和blob类型的映射。这个类是外国人写的,他们在使用hibernate的过程中发现了InformixDialect不支持skip,并缺少blob和clob映射的问题,就自行扩展了InformixDialect,并提交给了hibernate,希望hibernate的以后版本中添加支持informix 10的新特性的Dialect。
?
?
因为informix 10以前的版本分页查询只支持使用first,informix 10 开始,添加了skip关键字,hibernate自带的InformixDialect生成的sql分页语句不使用skip,所以上面的类中的三个方法添加了informix 10 的skip关键字支持。
(但是如果你的informix版本低于informix 10,应该将那三个方法注释掉。)
?
(在informix 10及以后版本中具体如何使用first,skip实现分页查询,网上能方便的找到。)
?
上面的类还增加了blob和clob两种字段的映射,开始我以为我项目中的大文本映射错误只是因为InformixDialect中缺少相应的大文本字段的映射,所以我直接将上面的类添加到项目中,并在项目的配置文件中设置使用该dialect,
?
修改后,在保存的时候可以将字符串成功插入到数据库的大文本字段中,但是在查询的时候不能从大文本字段中解析出文本内容来。
?
郁闷之余,又上网查informix数据库支持的数据类型,查到原来informix使用text类型存放大文本字段,于是我将上面的类中的构造方法改为:
?
?
public Informix10Dialect() { super(); //registerColumnType( Types.BLOB, "blob" ); registerColumnType( Types.CLOB, "text" ); }
?
?
持久化类中的大文本字段的annotation不做任何修改。
?
改完后启动项目测试一下,OK,大功告成,即能成功的将文本存进去又能将文本解析出来并设置到持久化对象的相应字段中。
?
最后说明一下,我项目中使用的informix的版本比较低,不支持skip,所以我把那三个添加skip支持的方法注释掉了。
?
我使用的InformixDialect全文如下:
?
?
package org.hibernate.dialect; import java.sql.Types; /** * Dialect for Informix 10. * <ul> * <li>hint for first rows</li> * <li>support for limitOffset</li> * <li>added types for BLOB and CLOB</li> * </ul> */ public class Informix10Dialect extends InformixDialect { /** * 添加BLOB与CLOB类型的映射 */ public Informix10Dialect() { super(); // registerColumnType(Types.BLOB, "blob" ); registerColumnType(Types.CLOB, "text" ); } //informix10支持使用skip m first n进行分页 // publi