写博客网站,数据库用mysql,对博文数据的存储采用的数据类型为text,持久层框架用的hibernate,一切看似平静,然而…..
问题初现
直接上代码
实体类对应字段1
2
3
4
5
6
7
8"md_content") (name =
private String md;
"html_content") (name =
private String html;
"summary") (name =
private String summary;
jpa1
2public interface ArticleRepository extends JpaRepository<Article, Long>, JpaSpecificationExecutor<Article> {
}
正常来说,单表的增删改我都是用的jpa直接处理,并且成功,但是!!!这里不正常!!!
通过断点查看,可以发现,数据通过jpa已经查出来了,但是映射不到实体类最终导致报错。
类型定义错误…
毫无头绪的错误,jpa之前用得舒舒服服的呀。抱着试一试的心态,用jdbctemplate写sql查询一次看看
emmmm,这tm什么鬼,summary有数据,md和html都没有…what?
锁定问题
通过上一步的查看,发现是数据库text格式的数据出的错,于是百度谷歌走一遭呗。
最终得到结果
hibernate对mysql数据库的数据类型映射里面,没有text…
心累,感觉这不像是hibernate该有的bug,但是谁让他就是不支持呢
解决方法有两个
- 一是改变hibernate方言,将text支持引用进去。本地写个类,继承MySQL5Dialect,添加注册
1
2
3
4
5
6
7public class CustomDialect extends MySQL5Dialect {
public CustomDialect() {
super();
registerHibernateType(Types.DECIMAL, Hibernate.BIG_DECIMAL.getName());
registerHibernateType(Types.LONGVARCHAR,Hibernate.TEXT.getName());
}
}
然后改配置文件的方言为本地改的这个就行…看似完美,呵呵
你会发现Hibernate
包下没有TEXT
这东东,你去Hibernate.TEXT.getName()
你点一辈子都没用,我在想网上的人是怎么Hibernate.出来东西的,我这里的 TEXT出轨了???
- 好吧,第二种,也是我这里实现的初版,给实体类字段加注解,其中
columnDefinition="TEXT"
也是上一个解决方式要加的,因为上一个方法死娘胎里了就没讲。
代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 这里@Lob注解表示属性将被持久化为Blob或者Clob类型,有人说lob是large object,emmm姑且相信吧,text也是lob的一类
// 懒加载,因为lob数据可能比较大,懒加载让他要用的时候再加载,提高性能。
(fetch = FetchType.LAZY)
// columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。表示对应数据库的text类型
"md_content", columnDefinition="TEXT") (name =
private String md;
(fetch = FetchType.LAZY)
"md_content", columnDefinition="TEXT") (name =
private String html;
(fetch = FetchType.LAZY)
"summary", columnDefinition="TEXT") (name =
private String summary;
至此,text的处理基本上完成了
对的,基本上
额外的bug
发现进过上面的处理,依旧有两个字段没有值,就是一开始的md和html,通过瞎改改解决了,上代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(fetch = FetchType.LAZY)
"md", columnDefinition="TEXT") (name =
//@Column(name = "md_content", columnDefinition="TEXT")
private String md;
(fetch = FetchType.LAZY)
"html", columnDefinition="TEXT") (name =
//@Column(name = "html_content", columnDefinition="TEXT")
private String html;
(fetch = FetchType.LAZY)
"summary", columnDefinition="TEXT") (name =
private String summary;
将column对应的数据库子弹的下划线去掉就可以,至于为什么嘛,我也不懂T-T
最终总结
到现在,依旧没有实现用jpa查询text类型的数据,因为text加不进hibernate方言里面。jdbctemplate可以实现了,然后改了个地方
下面是我最终的1
2
3
4
5
6
7
8
9
10
11
12
13
14
(fetch = FetchType.LAZY)
"md", columnDefinition="CLOB") (name =
private String md;
(fetch = FetchType.LAZY)
"html", columnDefinition="CLOB") (name =
private String html;
(fetch = FetchType.LAZY)
"summary", columnDefinition="CLOB") (name =
private String summary;
我把text改成了clob,因为hibernate没有text支持所以我觉得还是写clob可能会好点
在一个就是为什么字段设置下划线查不出数据。还有待调查。