使用jpa的實(shí)體對(duì)象轉(zhuǎn)json符串時(shí)懶加載的問題及解決
解決轉(zhuǎn)json符串時(shí)懶加載問題方法(1)
1.導(dǎo)入hibernate5轉(zhuǎn)json的Maven依賴:
<dependency> ? ? <groupId>com.fasterxml.jackson.datatype</groupId> ? ? <artifactId>jackson-datatype-hibernate5</artifactId> ? ? <version>2.9.4</version> </dependency>
2.配置MappingJackson2HttpMessageConverter對(duì)象:
@Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { ? ? Hibernate5Module module = new Hibernate5Module(); ?? ?module.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION); ?? ?module.enable(Hibernate5Module.Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS); ? ? MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ?? ?ObjectMapper mapper = converter.getObjectMapper(); ?? ?mapper.registerModule(module); ? ? ? ? return converter; }
3.在實(shí)體類中使用@JsonIgnore加關(guān)聯(lián)屬性上,在序列化時(shí)忽略掉該屬性即可:
@OneToMany @JoinColumn(name = "fk_uid") @JsonIgnore private Set<Comment> comments;
解決轉(zhuǎn)json符串時(shí)懶加載問題方法(2)
1.配置MappingJackson2HttpMessageConverter對(duì)象:
@Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { ? ? MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ?? ?ObjectMapper mapper = converter.getObjectMapper(); ?? ?mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY) ? ? return converter; }
2.在實(shí)體類中使用@JsonIgnore加關(guān)聯(lián)屬性上,在序列化時(shí)忽略掉該屬性即可:
@OneToMany @JoinColumn(name = "fk_uid") @JsonIgnore private Set<Comment> comments;
Rest風(fēng)格中關(guān)于JPA使用懶加載的坑
公司最近使用的ORM框架是JPA實(shí)現(xiàn)產(chǎn)品使用的是hibernate,曾經(jīng)看過一篇博客上面說的是如果團(tuán)隊(duì)里面沒有一個(gè)精通hibernate的人,那么最好不要使用它,我現(xiàn)在是深刻的體會(huì)到了。但是使用什么框架不是我能決定的,如果是我的話,我寧愿使用mybatis。吐槽完來講講出現(xiàn)的問題,因?yàn)槲覀冺?xiàng)目是一個(gè)電商的項(xiàng)目模塊比較多,所以各種表關(guān)聯(lián)。
用了一段時(shí)間以后,我們發(fā)現(xiàn)非常的慢,打開一個(gè)頁面要20多秒==!,后臺(tái)一直打印sql,我們在實(shí)體上面注解的LAZY看似并沒有起什么作用。各種調(diào)試各種百度但是一直找不到原因。
后面今天實(shí)現(xiàn)受不了了。我靜下來仔細(xì)分析了一下,各種調(diào)試以后,我突然意識(shí)到,我們的項(xiàng)目和一起拿的項(xiàng)目不一樣的地方在于現(xiàn)在這個(gè)項(xiàng)目全部是使用rest風(fēng)格的。
而以往只要使用了懶加載那么頁面上使用到了,才會(huì)查詢,因?yàn)槭鞘褂玫搅薺sp模板,是動(dòng)態(tài)的編譯的,說白一點(diǎn)就是其實(shí)jsp就是JAVA代碼。但是我們的不一樣,我們的將資源全部進(jìn)行序列化操作,然后通過json將數(shù)據(jù)給傳輸?shù)娇蛻舳?,那么在序列化的時(shí)候,就會(huì)將所有的實(shí)體給進(jìn)行序列化。
大概知道原因了以后,我的做法就是在返回的時(shí)候,動(dòng)態(tài)的指定哪一些實(shí)體不需要序列化,對(duì)于那種互相關(guān)聯(lián)的也忽略一邊。再進(jìn)行一遍操作的時(shí)候,果然不會(huì)那么慢了,最多一秒就出來了。我覺得這個(gè)坑還是必須注意一下的,不過我覺得還是沒有一個(gè)精通hibernate的人的原因。
這個(gè)就當(dāng)自己的一個(gè)總結(jié)吧,我覺得,對(duì)于技術(shù)選型一定要考慮具體情況,并不是好別人覺得好用就選什么。最后說一句,團(tuán)隊(duì)沒有hibernate大神,還是少用,會(huì)被坑的要死要死的。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Struts1簡介和入門_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Struts1簡介和入門的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11淺析mybatis和spring整合的實(shí)現(xiàn)過程
據(jù)官方的說法,在Mybatis3問世之前,Spring3的開發(fā)工作就已經(jīng)完成了,所以Spring3中還是沒有對(duì)Mybatis3的支持。因此由Mybatis社區(qū)自己開發(fā)了一個(gè)Mybatis-Spring用來滿足Mybatis用戶整合Spring的需求,下面通過Mybatis-Spring來整合Mybatis跟Spring的用法做介紹2015-10-10Java實(shí)現(xiàn)貪吃蛇大作戰(zhàn)小游戲(附源碼)
今天給大家?guī)淼氖切№?xiàng)目是 基于Java+Swing+IO流實(shí)現(xiàn) 的貪吃蛇大作戰(zhàn)小游戲。實(shí)現(xiàn)了界面可視化、基本的吃食物功能、死亡功能、移動(dòng)功能、積分功能,并額外實(shí)現(xiàn)了主動(dòng)加速和鼓勵(lì)機(jī)制,需要的可以參考一下2022-07-07Java設(shè)計(jì)模式之迭代器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java設(shè)計(jì)模式之迭代器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-08-08Java中FilterInputStream和FilterOutputStream的用法詳解
這篇文章主要介紹了Java中FilterInputStream和FilterOutputStream的用法詳解,這兩個(gè)類分別用于封裝輸入和輸出流,需要的朋友可以參考下2016-06-06