大腿的博客

springboot hibernate处理text格式数据

字数统计: 924阅读时长: 3 min
2018/10/14 Share

写博客网站,数据库用mysql,对博文数据的存储采用的数据类型为text,持久层框架用的hibernate,一切看似平静,然而…..

问题初现

直接上代码
实体类对应字段

1
2
3
4
5
6
7
8
@Column(name = "md_content")
private String md;

@Column(name = "html_content")
private String html;

@Column(name = "summary")
private String summary;

jpa

1
2
public 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,但是谁让他就是不支持呢
解决方法有两个

  1. 一是改变hibernate方言,将text支持引用进去。本地写个类,继承MySQL5Dialect,添加注册
    1
    2
    3
    4
    5
    6
    7
    public 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出轨了???

  1. 好吧,第二种,也是我这里实现的初版,给实体类字段加注解,其中 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
    // 懒加载,因为lob数据可能比较大,懒加载让他要用的时候再加载,提高性能。
    @Basic(fetch = FetchType.LAZY)
    // columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。表示对应数据库的text类型
    @Column(name = "md_content", columnDefinition="TEXT")
    private String md;

    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "md_content", columnDefinition="TEXT")
    private String html;

    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "summary", columnDefinition="TEXT")
    private String summary;

至此,text的处理基本上完成了
对的,基本上

额外的bug

发现进过上面的处理,依旧有两个字段没有值,就是一开始的md和html,通过瞎改改解决了,上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "md", columnDefinition="TEXT")
//@Column(name = "md_content", columnDefinition="TEXT")
private String md;

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "html", columnDefinition="TEXT")
//@Column(name = "html_content", columnDefinition="TEXT")
private String html;

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "summary", columnDefinition="TEXT")
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
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "md", columnDefinition="CLOB")
private String md;

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "html", columnDefinition="CLOB")
private String html;

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "summary", columnDefinition="CLOB")
private String summary;

我把text改成了clob,因为hibernate没有text支持所以我觉得还是写clob可能会好点
在一个就是为什么字段设置下划线查不出数据。还有待调查。

原文作者:大腿君的大腿君

原文链接:https://shiyuquan.github.io/2018/10/14/springboot-hibernate处理text格式数据/

发表日期:2018-10-14 15:56:19

更新日期:2018-10-14 17:23:34

版权声明:来自于大腿的许可

CATALOG
  1. 1. 问题初现
  2. 2. 锁定问题
  3. 3. 额外的bug
  4. 4. 最终总结