-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.xml
559 lines (463 loc) · 126 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[win10系统下使用telnet完成一次简单的HTTP请求]]></title>
<url>/2018/03/31/win10%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%BD%BF%E7%94%A8telnet%E5%AE%8C%E6%88%90%E4%B8%80%E6%AC%A1%E7%AE%80%E5%8D%95%E7%9A%84HTTP%E8%AF%B7%E6%B1%82/</url>
<content type="html"><![CDATA[<h1 id="开启telnet客户端(若已开启请忽略)"><a href="#开启telnet客户端(若已开启请忽略)" class="headerlink" title="开启telnet客户端(若已开启请忽略)"></a>开启telnet客户端(若已开启请忽略)</h1><p>win10系统下默认telnet客户端是关闭的,需要自己去开启,设置过程简单如下图</p>
<a id="more"></a>
<p><img src="https://img-blog.csdn.net/2018033117163170?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yX0RvdURv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="win10打开telnet客户端"></p>
<h1 id="使用telnet进行简单的HTTP请求"><a href="#使用telnet进行简单的HTTP请求" class="headerlink" title="使用telnet进行简单的HTTP请求"></a>使用telnet进行简单的HTTP请求</h1><p>步骤如下:</p>
<ul>
<li>打开cmd,输入: telnet www.baidu.com 80<br>会跳转进入空白的命令行页面。</li>
<li>输入: <code>Ctrl</code> + <code>]</code>页面会显示<code>欢迎使用 Microsoft Telnet Client</code></li>
<li>再按一次回车(Enter)键</li>
<li>进入一个空白页,输入: GET / HTTP/1.0</li>
<li>按两次回车(Enter)键</li>
<li>最后返回一次HTTP完整的请求数据,包括请求头,和主体</li>
</ul>
]]></content>
<categories>
<category> Note </category>
</categories>
<tags>
<tag> HTTP </tag>
</tags>
</entry>
<entry>
<title><![CDATA[你们都遇到过什么样的室友?]]></title>
<url>/2018/03/15/%E4%BD%A0%E4%BB%AC%E9%83%BD%E9%81%87%E5%88%B0%E8%BF%87%E4%BB%80%E4%B9%88%E6%A0%B7%E7%9A%84%E5%AE%A4%E5%8F%8B%EF%BC%9F/</url>
<content type="html"><![CDATA[<p>生活,就像一杯难咽的酒!一部分人是喝着难咽的酒,却依然微笑着说再来,这种人是英雄,生活再苦再累也勇敢的面对;也有一部分人则是喝一口就不想喝了,这种人面对小困难小无奈就畏畏缩缩。<br>生活里,你有你的苦楚,他有他的无奈。每个人都有自己的路要走,无论是笔直的坎坷路途,还是曲折的狭窄小道。每个人都有自己的事要做,不论是真心实意的喜欢,还是压迫牵强的接受。<br><a id="more"></a></p>
<h2 id="我不管,我就是想吐槽"><a href="#我不管,我就是想吐槽" class="headerlink" title="我不管,我就是想吐槽"></a>我不管,我就是想吐槽</h2><p>说了这么多废话,主题呢?为什么会说这些所谓的废话呢,那是因为,最近对自己的室友很是无奈。原本出来工作就是奔着好好闯一番的心态来的,知道事业不是那么容易做好的,生活上多多少少都会有些坎坷,没想到,我这2018年来<br>遇到的烦心事全是租房室友身上的事。如果是你,有可能会破口大骂了。这些日子,我实在是忍不下去了,既然跟他们说了不听,那我也不能动武,只能写篇博文吐槽一下,告诫一下,租房时要考虑的问题。<br>这是个什么样的遭遇呢?</p>
<h2 id="理想中的“爱情公寓”"><a href="#理想中的“爱情公寓”" class="headerlink" title="理想中的“爱情公寓”"></a>理想中的“爱情公寓”</h2><p>去年光棍节,没错,就是光棍节,我这个bachelor搬进了我人生中第4次租的房。刚进来,行李搬到门口,一个男的,过来打招呼,一聊,以后是室友,多多关照,说完还帮我搬行李,再一会儿又来一个女的,说是也住这儿,只是过几<br>天才把行李搬过来。那天,三个人聊的还是蛮开心的,心想又遇到几个不错的室友。心中顿时浮现爱情公寓式的生活,爱情不谈,毕竟人家是有心上人的,只求有一帮聊得来的好朋友,下班后可以一起哈皮。<br><img src="/assets/blogImg/20180315/aqgy.jpg" alt=""></p>
<h2 id="现实却是如此的“冷漠”"><a href="#现实却是如此的“冷漠”" class="headerlink" title="现实却是如此的“冷漠”"></a>现实却是如此的“冷漠”</h2><p>可时间过去一个多月了,渐渐的发现跟想象中的完全不一样啊。一个套间里四个卧室,一个卫生间,一个小厨房,客厅已经不能算是客厅了,有一间卧室是被后来隔出来做成的卧室,客厅基本上是一天二十四小时都是乌漆嘛黑的。一<br>开始找房子的时候,感觉亮堂完全是因为所有的卧室门都开着才会那么亮的。住进来之后,就一开始见面还聊聊,开个门啥的,过一段时间,一个个的见面都不打招呼,见面给你们个微笑,一个个跟没见到似的,顶多点个头,想想就<br>觉得冷漠,让人哆嗦。</p>
<h2 id="所谓的“爱干净爱整洁”"><a href="#所谓的“爱干净爱整洁”" class="headerlink" title="所谓的“爱干净爱整洁”"></a>所谓的“爱干净爱整洁”</h2><p>隔壁大姐,刚刚进来时跟我说,她有点洁癖,喜欢干净,让我们每次洗完澡,把地拖一拖,(这个拖把是我出资一起买的),刚开始,这个拖把还放在卫生间门口,每次洗完澡我也会拖下地,其实也就地上稍微有点水,哪儿有洗澡地上<br>没点水的哦。后来我发现拖把不见了,我还以为被打扫的阿姨拿走了,我也没问多少,结果再过一段时间,它竟然又神奇的出现在了卫生间门口,我还以为阿姨又放回来了,偶然的一次,发现拖把被隔壁大姐藏在卧室,问她干嘛放自己<br>卧室,她说怕我们把拖把弄脏。当时我就觉得搞笑,拖把拖地的,你还想要多干净,还藏卧室,不知道咋想的。每次洗澡的时候都会发现地上一大堆隔壁大姐掉的长长的头发,这些头发后来还堵塞了下水道,公寓管家喊来下水道师傅来<br>通水道,在微信群里通知我们通完之后要收25块钱,她就一下次在群里跳出来责备下水道设计的不合理,说了一大堆不是,还说到,卫生间垃圾桶满了都是她倒的,我当时就无语了,这个卫生间,她用的是最多的,里面的纸篓,我们其<br>他人加起来都没她一个人用的多,争这种小事,我当然不予理睬了,在一旁看着笑笑罢了,本来我都准备交我该交的那份钱了,看得出来当时管家应该很尴尬,最后管家说自己跟领导申请免去这次了,至于真假都不知道,25块钱也不知<br>道是不是她自己贴的。<br>是爱干净,每次隔壁大姐用完卫生间会拖地,可是不知道开门透气的吗?我把卫生间门开下来透气,每次都被你关上,只开个里面的窗户,你上哪儿去透气啊,搞得卫生间臭气熏天,早上进去洗脸刷牙差点被熏得晕倒。<br><img src="/assets/blogImg/20180315/wunai.jpg" alt=""></p>
<h2 id="热水问题"><a href="#热水问题" class="headerlink" title="热水问题"></a>热水问题</h2><p>17年底,18年初的时候,四间卧室住满了人,冬天了,热水器热水供应不足,隔壁女的说,以后分开洗,每人两天洗一次,有一哥们儿还好,在健身房上班,晚上基本洗完澡回来,<br>剩下我们两个男的一个女的了,想着女的洗澡用水多,让着点。我6点下班,有时候高兴就在公司多待会儿,等到七点多再回来,刚好差不多第一批该洗澡的人洗好了,我回来刚好可以洗澡了。起初,我发现回来的时候,热水器的指针<br>都是在冷水那块儿,根本没有热水,觉得可能是因为她们哪个刚刚洗完澡吧,我再等会儿去洗澡。时间久了,发现不对劲啊,怎么每天都这样,隔壁男的几乎没怎么看到他开门去洗澡,大部分都是另一边的大姐去卫生间在用,经过一<br>段时间观察,果然,她每天都用一大部分热水,不管是洗澡还是洗脸,甚至还有一个很大很大的桶,专门泡脚的桶,一装差不多能装个热水器的四分之一的热水,加上其他地方摸摸搞搞的,真的很好奇她是怎么用的。<br>过了个农历年,新年新气象,我提前一天来,路上堵了一下午的车,流了不少汗,准备回来赶紧洗个澡的,晚点还要去朋友那儿。来了发现隔壁大姐还在,毕竟新年,上来我还敲门祝福新年快乐,然后我跟她说我要洗个澡,待会儿还要<br>出去,然后她端了一盆衣服进卫生间洗衣服。等我行李放下后进卫生间脱了衣服准备洗澡,结果发现热水被用的一点不剩,呵呵,我终于知道为什么热水不够用了,洗澡,泡脚,洗衣服全是用的热水,更可怕的是,一热水器的热水全用<br>来洗衣服了。这下真的彻底无语了。当时真的想敲她门,拎出来好好谈谈这公共区域的问题。由于刚刚过年,想想就算了。</p>
<h2 id="厨房问题"><a href="#厨房问题" class="headerlink" title="厨房问题"></a>厨房问题</h2><p>在健身房上班的哥们儿,住着我们这儿最“豪华”的一间,也是第一个搬进来的,每天晚上10点之后下班回来却只是吃着煮的方便面,我是想不通,也许他觉得方便面比什么都好吃。你吃就吃吧,煮完面的锅从来不洗,每次都是第二天<br>准备煮的时候再洗,日积月累的,洗碗池里全是方便面的剩渣,厨房全是一股方便面的味道。本来我还打算自己买套厨具,好好学学做菜,看这样,也放弃了。<br><img src="/assets/blogImg/20180315/juewang.jpg" alt=""></p>
<h2 id="一些其他问题"><a href="#一些其他问题" class="headerlink" title="一些其他问题"></a>一些其他问题</h2><p>比如,大半夜的起身去解手关门声超大,快睡着了都能被吵醒。隔壁大姐每次进卫生间,一进就是差不多半个小时,而且很喜欢进卫生间。住房也有问题,热水器前几天刚刚坏,他们发现了竟然不报修。房租不便宜,购买的家电却是劣<br>质货,这样的公寓,别人问起来我也不会推荐,自己更是不会再选择了。<br>问题真的很多,都很奇葩,都不想说了。</p>
<h2 id="提醒了依旧这样"><a href="#提醒了依旧这样" class="headerlink" title="提醒了依旧这样"></a>提醒了依旧这样</h2><p>提醒了,依旧这样,我都不知道怎么才能让他们稍微在意下别人的感受,真的不想把事情搞大,不知道有没有人也有过这样的遭遇。</p>
<h2 id="没有对比就没有伤害"><a href="#没有对比就没有伤害" class="headerlink" title="没有对比就没有伤害"></a>没有对比就没有伤害</h2><p>对比之前的室友和现在的室友,真的很怀念啊!曾经,我的生活是这样的,下班回来和室友一起聊天,一起吃饭,一起玩游戏开黑,一起出去看电影,一起去游乐场玩。再看看现在,唉!<br>遇到好的室友,且行且珍惜。</p>
<h2 id="生活这杯酒"><a href="#生活这杯酒" class="headerlink" title="生活这杯酒"></a>生活这杯酒</h2><p>属于你的这杯酒,哭着也得喝下去。不过,想着其他开心的人和事,这些都不算什么了,不行就搬走呗。</p>
<p><br></p>
<p>毕业快有两年了,好多出来工作的人肯定都有过类似找个什么样的租房?房租要多少租金自己能接受,如果与人合租,室友会不会很坑?等等一些扰人的想法。或许你就在家附近工作不必考虑这些,又或许你已经在某个地方拥有了一<br>套属于自己的房子。但是,我毕业出来之后,发现,绝大部分人都是些异地打拼。以后啊,找房子,得提前一个多月就开始找,好的房源大都在中介手里,但是我相信只要自己花点心思,也能找到,找房子的时候各方面得多考虑考虑,个人<br>要求不同,根据自己的想法来,男生最好还是跟男生一起住,若果想碰运气把妹的话,那就另当别论了;女生最好还是跟女生一起,只有女的能理解女的。凡事多谦让点,不让自己吃亏的前提下也要多为别人考虑考虑,很有可能你以后<br>会感谢现在你所做到的与人和睦,他们可能会成为你今后的挚友,也可以是你人生路上的导师,总之一切皆有可能。我现在就是,当初相处的很好的室友现在给予了我莫大的帮助,真的很感谢当时的自己有好好珍惜这些室友。<br><br><br>还是那句:且行且珍惜,与人方便就是自己方便,与人帮助就是帮助自己。<br><br><br><br><br><img src="/assets/blogImg/20180315/Java.jpg" alt=""><br>我这儿有故事也有酒,有空来听听!</p>
]]></content>
<categories>
<category> Essay </category>
</categories>
<tags>
<tag> 生活 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[javascript中 typeof 和 instanceof区别]]></title>
<url>/2018/03/15/javascript%E4%B8%AD-typeof-%E5%92%8C-instanceof%E5%8C%BA%E5%88%AB/</url>
<content type="html"><![CDATA[<h3 id="typeof"><a href="#typeof" class="headerlink" title="typeof()"></a>typeof()</h3><p>用来获取一个变量或者表达式的类型,typeof返回如下几个结果:</p>
<pre><code>number
boolean
string
function(函数)
object(NULL,数组,对象)
undefined
</code></pre><a id="more"></a>
<p>例如:<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> a = <span class="number">12</span>;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="keyword">typeof</span>(a));</span><br></pre></td></tr></table></figure></p>
<p>显示结果为 <code>number</code></p>
<h3 id="instanceof"><a href="#instanceof" class="headerlink" title="instanceof"></a>instanceof</h3><p>常用来判断一个变量是否是某个对象的实例,返回结果是boolean值(<code>true</code> / <code>false</code>)<br>例如:<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">People</span>(<span class="params"></span>)</span>{</span><br><span class="line">}</span><br><span class="line"><span class="keyword">var</span> student = <span class="keyword">new</span> People();</span><br><span class="line"><span class="built_in">console</span>.log(student <span class="keyword">instanceof</span> People);</span><br></pre></td></tr></table></figure></p>
<p>返回结果为<code>true</code></p>
]]></content>
<categories>
<category> Note </category>
</categories>
<tags>
<tag> js </tag>
</tags>
</entry>
<entry>
<title><![CDATA[git基本使用]]></title>
<url>/2018/03/06/git%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</url>
<content type="html"><![CDATA[<h2 id="一、git工作流程"><a href="#一、git工作流程" class="headerlink" title="一、git工作流程"></a>一、git工作流程</h2><p>工作流程:</p>
<pre><code>1. 克隆远程资源库中项目代码到本地(本地会生成.git隐藏文件和项目代码,项目代码为工作区)
2. 对工作区代码进行添加,修改,删除一系列编辑操作
3. add 代码到暂存区(index)
4. 如果远程资源库代码有其他人提交新的版本,则需要拉取并合并到本地代码
5. 查看合并代码是否有冲突,若有冲突,修改之后,再一次 add 到暂存区
6. commit 代码到本地仓库
7. push 代码到远程资源库
</code></pre><a id="more"></a>
<p>我将工作流程简单的绘制成一幅图,由图可清晰看出以一系列的操作步骤<br><img src="/assets/blogImg/180306/git基本操作.png" alt="git基本操作"></p>
<blockquote>
<p>附上:<a href="http://www.bootcss.com/p/git-guide/" target="_blank" rel="noopener">git使用简易指南</a></p>
</blockquote>
<h2 id="二、git常用命令"><a href="#二、git常用命令" class="headerlink" title="二、git常用命令"></a>二、git常用命令</h2><h3 id="从远端拉取并合并代码到本地仓库"><a href="#从远端拉取并合并代码到本地仓库" class="headerlink" title="从远端拉取并合并代码到本地仓库"></a>从远端拉取并合并代码到本地仓库</h3><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">git pull</span></span><br></pre></td></tr></table></figure>
<h3 id="将修改过的代码生成快照添加到暂存区"><a href="#将修改过的代码生成快照添加到暂存区" class="headerlink" title="将修改过的代码生成快照添加到暂存区"></a>将修改过的代码生成快照添加到暂存区</h3><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">add</span><span class="bash"> * 或 <filename></span></span><br></pre></td></tr></table></figure>
<h3 id="将代码提交到本地仓库"><a href="#将代码提交到本地仓库" class="headerlink" title="将代码提交到本地仓库"></a>将代码提交到本地仓库</h3><figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -m <span class="string">"..."</span> <span class="comment">//双引号内为:注释,代码修改信息摘要</span></span><br></pre></td></tr></table></figure>
<h3 id="提交代码到远程资源库"><a href="#提交代码到远程资源库" class="headerlink" title="提交代码到远程资源库"></a>提交代码到远程资源库</h3><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin <span class="keyword">master</span> <span class="title">//master</span>可以换成其他分支名</span><br></pre></td></tr></table></figure>
<h3 id="设置git的user-name-和Email"><a href="#设置git的user-name-和Email" class="headerlink" title="设置git的user name 和Email"></a>设置git的user name 和Email</h3><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --global user<span class="selector-class">.name</span> <span class="string">"username"</span> <span class="comment">//username为远程资源库账号名</span></span><br><span class="line">git config --global user<span class="selector-class">.email</span> <span class="string">"user@gmail.com"</span> <span class="comment">//user@gmail.com为远程资源库注册邮箱</span></span><br></pre></td></tr></table></figure>
<h3 id="克隆已有的远程资源库代码到本地"><a href="#克隆已有的远程资源库代码到本地" class="headerlink" title="克隆已有的远程资源库代码到本地"></a>克隆已有的远程资源库代码到本地</h3><p>1.https:// 协议<br><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">clone</span> <span class="title">https</span>://github.com/username/demo</span><br></pre></td></tr></table></figure></p>
<p>2.ssh:// 协议<br><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">clone</span> <span class="title">git</span>@github.com:username/demo.git</span><br></pre></td></tr></table></figure></p>
<h3 id="本地创建文件"><a href="#本地创建文件" class="headerlink" title="本地创建文件"></a>本地创建文件</h3><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">git touch filename</span></span><br></pre></td></tr></table></figure>
<h3 id="使用当前目录为git仓库"><a href="#使用当前目录为git仓库" class="headerlink" title="使用当前目录为git仓库"></a>使用当前目录为git仓库</h3><figure class="highlight swift"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">init</span> <span class="comment">//后面可加上指定目录作为本地git仓库</span></span><br></pre></td></tr></table></figure>
<p>执行后,会在当前目录或指定的目录创建隐藏的<code>.git</code>文件</p>
<h3 id="查看状态"><a href="#查看状态" class="headerlink" title="查看状态"></a>查看状态</h3><figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git status <span class="comment">//查看状态完整信息</span></span><br><span class="line">或者</span><br><span class="line">git status -s <span class="comment">//查看简短的状态信息</span></span><br></pre></td></tr></table></figure>
<h3 id="查看提交历史"><a href="#查看提交历史" class="headerlink" title="查看提交历史"></a>查看提交历史</h3><figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> <span class="comment">//查看详细的提交历史</span></span><br><span class="line">或者</span><br><span class="line">git <span class="built_in">log</span> --online <span class="comment">//查看提交历史的简洁版</span></span><br></pre></td></tr></table></figure>
<h3 id="比较改动"><a href="#比较改动" class="headerlink" title="比较改动"></a>比较改动</h3><p>工作目录暂存区比较<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">git diff</span></span><br></pre></td></tr></table></figure></p>
<p>已暂存将要提交的内容(add后准备commit的内容)<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">git diff cached</span></span><br></pre></td></tr></table></figure></p>
<h3 id="移除和移动"><a href="#移除和移动" class="headerlink" title="移除和移动"></a>移除和移动</h3><p>移除(工作区移除,暂存区移除)<br><figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//工作目录移除</span></span><br><span class="line"><span class="keyword">rm</span> filename</span><br><span class="line"><span class="comment">//暂存区移除</span></span><br><span class="line">git <span class="keyword">rm</span> filename</span><br></pre></td></tr></table></figure></p>
<p>移动(实现重命名)<br><figure class="highlight cos"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">mv</span> filename <span class="comment">//待修改的文件</span></span><br></pre></td></tr></table></figure></p>
<h3 id="git分支管理"><a href="#git分支管理" class="headerlink" title="git分支管理"></a>git分支管理</h3><p>1.列出分支<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">git branch</span></span><br></pre></td></tr></table></figure></p>
<p>2.手动创建一支分支<br><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span><span class="keyword">branchname </span>// <span class="keyword">branchname为分支名</span></span><br></pre></td></tr></table></figure></p>
<p>3.切换分支<br><figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout branchname <span class="comment">// 切换到分支名为branchname的分支</span></span><br></pre></td></tr></table></figure></p>
<p>4.手动创建分支并立即切换到该分支下<br><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">git</span> checkout -<span class="keyword">b </span><span class="keyword">branchname </span>// 手动创建一个名为<span class="keyword">branchname </span>的分支并立即切换到该分支下</span><br></pre></td></tr></table></figure></p>
<p>5.删除分支<br><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>-d <span class="keyword">branchname </span>// 删除<span class="keyword">branchname分支</span></span><br></pre></td></tr></table></figure></p>
<p>6.合并分支<br><figure class="highlight cos"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">merge</span> branchname <span class="comment">// 将branchname分支合并到当前分支</span></span><br></pre></td></tr></table></figure></p>
<h2 id="三、异常"><a href="#三、异常" class="headerlink" title="三、异常"></a>三、异常</h2><p>出现以下异常:<br><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">remote: Counting objects: 86, done.</span><br><span class="line">remote: Compressing objects: 100% (82/82), done.</span><br><span class="line"><span class="keyword">error: </span>RPC failed; curl 18 transfer closed with outstanding read data remaining</span><br><span class="line">fatal: The remote end hung up unexpectedly</span><br><span class="line">fatal: early EOF</span><br><span class="line">fatal: unpack-objects failed</span><br></pre></td></tr></table></figure></p>
<p>执行如下操作<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git<span class="built_in"> config </span>--global http.postBuffer 524288000</span><br></pre></td></tr></table></figure></p>
<p>执行之后可能需要过一会儿才可以恢复正常使用</p>
]]></content>
<categories>
<category> Note </category>
</categories>
<tags>
<tag> git </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Spring boot+Thymeleaf+spring-data-jpa简单项目搭建]]></title>
<url>/2018/02/28/Spring-boot+Thymeleaf+spring-data-jpa%E7%AE%80%E5%8D%95%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/</url>
<content type="html"><![CDATA[<blockquote>
<p>笔记整理</p>
</blockquote>
<ul>
<li>Spring Boot搭建简单项目,容易上手,无需手动配置繁杂的xml文件,copy大量的重复配置代码。</li>
<li>Thymeleaf模板引擎渲染web视图,可完全替代JSP,使用Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,(即创建 .html文件可被浏览器直接浏览)因此也可以用作静态建模。</li>
<li>spring-data-jpa可简化数据访问,减少大量sql语句,尤其是基本的增删改查</li>
</ul>
<a id="more"></a>
<blockquote>
<p>搭建环境:eclipse、java 1.8.0_111 、spring boot 1.5.10</p>
</blockquote>
<h2 id="一、创建项目"><a href="#一、创建项目" class="headerlink" title="一、创建项目"></a>一、创建项目</h2><h3 id="1-第一步"><a href="#1-第一步" class="headerlink" title="1. 第一步"></a>1. 第一步</h3><p><img src="/assets/blogImg/180228/1.png" alt="第一步"><br>配置选好及相关信息填好后进行下一步</p>
<h3 id="2-第二步"><a href="#2-第二步" class="headerlink" title="2. 第二步"></a>2. 第二步</h3><p><img src="/assets/blogImg/180228/2.png" alt="第二步"><br>这一步是选择所需要添加的依赖,这边既然是<code>spring boot</code> 整合<code>thymeleaf</code> 和 <code>Jpa</code> 搭建的web项目,勾选途中相关的库选项即可,然后点击 Next -> Finish。<br>之后eclipse便会自动下载相关的依赖jar包,期间可能需要等一会儿。若是上一步有少勾选的,也可在建好的项目中的<code>pom.xml</code>文件中手动添加依赖<br>此处相关依赖有:<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-data-jpa<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-thymeleaf<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure></p>
<p>创建好后,项目基础框架如下图:<br><img src="/assets/blogImg/180228/3.png" alt="初始项目框架"><br>此时,项目已经可以运行,<br>spring boot 默认提供静态资源的位置为:<code>src/main/resources/static</code><br>而模板放在:<code>src/main/resources/templates</code>下</p>
<blockquote>
<p>注: Java代码均要写在DemoApplication.java的同级包中或子包中</p>
</blockquote>
<h3 id="3-配置application-properties文件"><a href="#3-配置application-properties文件" class="headerlink" title="3.配置application.properties文件"></a>3.配置application.properties文件</h3><h4 id="3-1-基本配置:"><a href="#3-1-基本配置:" class="headerlink" title="3.1 基本配置:"></a>3.1 基本配置:</h4><pre><code>- spring.datasource.driver-class-name= # 数据源驱动
- spring.datasource.url= # 数据源
- spring.datasource.username= # 数据库用户名
- spring.datasource.password= # 数据库密码
</code></pre><blockquote>
<p>配置到这儿,已经可以运行简单项目了。</p>
<h4 id="3-2-其他配置"><a href="#3-2-其他配置" class="headerlink" title="3.2 其他配置"></a>3.2 其他配置</h4><h5 id="3-2-1-模板引擎配置"><a href="#3-2-1-模板引擎配置" class="headerlink" title="3.2.1 模板引擎配置"></a>3.2.1 模板引擎配置</h5><p>若thymeleaf对不严格的HTML标签解析出错时,需要添加:</p>
</blockquote>
<pre><code>spring.thymeleaf.mode=LEGACYHTML5
</code></pre><p>非严格的thymeleaf格式 你可能会发现在默认配置下,thymeleaf对html文件内容要求很严格,比如<code><meta charset="UTF-8" /></code>, 如果少最后的标签封闭符号/,运行项目访问当前页面时就会报如下异常:<br><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">org<span class="selector-class">.xml</span><span class="selector-class">.sax</span><span class="selector-class">.SAXParseException</span>: 元素类型 <span class="string">"meta"</span> 必须由匹配的结束标记 <span class="string">"</meta>"</span> 终止。</span><br><span class="line"> at com<span class="selector-class">.sun</span><span class="selector-class">.org</span><span class="selector-class">.apache</span><span class="selector-class">.xerces</span><span class="selector-class">.internal</span><span class="selector-class">.util</span><span class="selector-class">.ErrorHandlerWrapper</span><span class="selector-class">.createSAXParseException</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at com<span class="selector-class">.sun</span><span class="selector-class">.org</span><span class="selector-class">.apache</span><span class="selector-class">.xerces</span><span class="selector-class">.internal</span><span class="selector-class">.util</span><span class="selector-class">.ErrorHandlerWrapper</span><span class="selector-class">.fatalError</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at com<span class="selector-class">.sun</span><span class="selector-class">.org</span><span class="selector-class">.apache</span><span class="selector-class">.xerces</span><span class="selector-class">.internal</span><span class="selector-class">.impl</span><span class="selector-class">.XMLErrorReporter</span><span class="selector-class">.reportError</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at com<span class="selector-class">.sun</span><span class="selector-class">.org</span><span class="selector-class">.apache</span><span class="selector-class">.xerces</span><span class="selector-class">.internal</span><span class="selector-class">.impl</span><span class="selector-class">.XMLErrorReporter</span><span class="selector-class">.reportError</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at com<span class="selector-class">.sun</span><span class="selector-class">.org</span><span class="selector-class">.apache</span><span class="selector-class">.xerces</span><span class="selector-class">.internal</span><span class="selector-class">.impl</span><span class="selector-class">.XMLScanner</span><span class="selector-class">.reportFatalError</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> ...</span><br></pre></td></tr></table></figure></p>
<p>因此,application.properties配置文件中建议增加下面这段:</p>
<pre><code>spring.thymeleaf.mode=LEGACYHTML5
</code></pre><p><code>spring.thymeleaf.mode</code>的默认值是<code>HTML5</code>,其实是一个很严格的检查,改为<code>LEGACYHTML5</code>可以得到一个可能更友好亲切的格式要求。需要注意的是,<code>LEGACYHTML5</code>需要搭配一个额外的库<code>NekoHTML</code>才可用。<br>因此,需要引入相关依赖:<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>net.sourceforge.nekohtml<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>nekohtml<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure></p>
<p>此外,thymeleaf的其他配置默认如下:<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 是否关闭thymeleaf缓存,关闭后,在开发过程中修改html文件后会立即生效,不需要重新启动spring boot项目</span></span><br><span class="line">spring.thymeleaf.<span class="attribute">cache</span>=<span class="literal">true</span></span><br><span class="line"><span class="comment"># 检查模板位置是否存在</span></span><br><span class="line">spring.thymeleaf.<span class="attribute">check-template-location</span>=<span class="literal">true</span></span><br><span class="line"><span class="comment"># 支持的文本类型</span></span><br><span class="line">spring.thymeleaf.<span class="attribute">content-type</span>=text/html</span><br><span class="line"><span class="comment"># 是否启用MVC视图解析</span></span><br><span class="line">spring.thymeleaf.<span class="attribute">enabled</span>=<span class="literal">true</span></span><br><span class="line"><span class="comment"># 模板使用的编码</span></span><br><span class="line">spring.thymeleaf.<span class="attribute">encoding</span>=UTF-8</span><br><span class="line"><span class="comment"># 指定名称的模板文件排除解析队列,名称用","隔开</span></span><br><span class="line">spring.thymeleaf.excluded-view-names=</span><br><span class="line"><span class="comment"># 默认模板配置路径,templates后的"/"不能少</span></span><br><span class="line">spring.thymeleaf.<span class="attribute">prefix</span>=classpath:/templates/</span><br><span class="line"><span class="comment"># 默认模板的后缀</span></span><br><span class="line">spring.thymeleaf.<span class="attribute">suffix</span>=.html </span><br><span class="line"><span class="comment"># Order of the template resolver in the chain.</span></span><br><span class="line">spring.thymeleaf.template-resolver-order=</span><br><span class="line"><span class="comment"># 指定名称的模板文件才可被解析,名称用","隔开</span></span><br><span class="line">spring.thymeleaf.view-names=</span><br></pre></td></tr></table></figure></p>
<h5 id="3-2-2-Jpa主要配置"><a href="#3-2-2-Jpa主要配置" class="headerlink" title="3.2.2 Jpa主要配置"></a>3.2.2 Jpa主要配置</h5><p>添加配置:</p>
<pre><code>spring.jpa.properties.hibernate.hbm2ddl.auto=update
</code></pre><p>此配置是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下: </p>
<ul>
<li><code>create</code>:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。</li>
<li><code>create-drop</code>:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。</li>
<li><code>update</code>:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。</li>
<li><code>validate</code>:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。</li>
</ul>
<p>此外,可添加:</p>
<pre><code>spring.jpa.show-sql = true
</code></pre><p>用来运行项目时可以在控制台输出jpa转化的具体的sql语句,方便查看和测试</p>
<blockquote>
<p>到目前为止,基本配置文件完成,可以开始建立项目</p>
</blockquote>
<h2 id="二、项目启动运行"><a href="#二、项目启动运行" class="headerlink" title="二、项目启动运行"></a>二、项目启动运行</h2><p>由于spring boot默认使用Tomcat作为web服务器,只需引入上述依赖中的<code>spring-boot-starter-web</code>便是可,这使得搭建一个web项目变得更加简单,项目创建好后,只需启动<code>XxxApplication.java</code>文件的main方法即可。此处启动的是<code>DemoApplication.java</code>中的main方法 </p>
<h2 id="三、-MVC模式下项目搭建"><a href="#三、-MVC模式下项目搭建" class="headerlink" title="三、 MVC模式下项目搭建"></a>三、 MVC模式下项目搭建</h2><h3 id="1-model类"><a href="#1-model类" class="headerlink" title="1. model类"></a>1. model类</h3><p>model类创建需要使用相关jpa注解,常用注解可参考<a href="http://www.regularmisu.com/2018/02/24/spring-data-jpa%E5%B8%B8%E7%94%A8%E6%B3%A8%E8%A7%A3/">链接</a><br><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> javax.persistence.Column;</span><br><span class="line"><span class="keyword">import</span> javax.persistence.Entity;</span><br><span class="line"><span class="keyword">import</span> javax.persistence.GeneratedValue;</span><br><span class="line"><span class="keyword">import</span> javax.persistence.Id;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Entity</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">User</span> </span>{</span><br><span class="line"> <span class="meta">@Id</span></span><br><span class="line"> <span class="meta">@GeneratedValue</span></span><br><span class="line"> <span class="keyword">private</span> <span class="built_in">Long</span> id;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Column(nullable = false)</span></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Column(length = 10)</span></span><br><span class="line"> <span class="keyword">private</span> Integer age;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> User(String name, Integer age) {</span><br><span class="line"> <span class="keyword">this</span>.name = name;</span><br><span class="line"> <span class="keyword">this</span>.age = age;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//省略get、set方法</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>在上述配置下,此时运行项目,数据库便会自动创建User表:<br><img src="/assets/blogImg/180228/4.png" alt="Jpa生成的数据库表"></p>
<h3 id="2-数据访问接口-仓储层"><a href="#2-数据访问接口-仓储层" class="headerlink" title="2.数据访问接口(仓储层)"></a>2.数据访问接口(仓储层)</h3><p>User类的对应数据访问接口<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">import org.springframework.data.jpa.repository.JpaRepository;</span><br><span class="line">import com.ziv.model.User;</span><br><span class="line"></span><br><span class="line">public<span class="built_in"> interface </span>UserRepository extends JpaRepository<User, Long> {</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>此接口需要继承<code>JpaRepository</code>接口,并修改泛型,第一个为对应model类的类名(此处为<code>User</code>),第二个为对应model类的主键的类型(此处为<code>Long</code>)</p>
<h3 id="3-Controller-控制层"><a href="#3-Controller-控制层" class="headerlink" title="3.Controller(控制层)"></a>3.Controller(控制层)</h3><h4 id="3-1-Controller基础注解"><a href="#3-1-Controller基础注解" class="headerlink" title="3.1 Controller基础注解"></a>3.1 Controller基础注解</h4><ul>
<li>@Controller: 修饰class,用来创建处理http请求的对象</li>
<li>RestController:Spring4之后加入的注解,原来在<code>@Controller中</code>返回json需要<code>@ResponseBody</code>来配合,如<br>果直接用<code>@RestController</code>替代<code>@Controller</code>就不需要再配置<code>@ResponseBody</code>,默认返回json格式。</li>
<li>RequestMapping:配置url映射</li>
</ul>
<p>若一个Controller类中有Web页面需要渲染,类注解只能用<code>@Controller</code>,否则报错</p>
<h4 id="3-2-Controller简单代码编写"><a href="#3-2-Controller简单代码编写" class="headerlink" title="3.2 Controller简单代码编写"></a>3.2 Controller简单代码编写</h4><figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><span class="meta-keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span></span><br><span class="line"><span class="meta"><span class="meta-keyword">import</span> org.springframework.stereotype.Controller;</span></span><br><span class="line"><span class="meta"><span class="meta-keyword">import</span> org.springframework.ui.Model;</span></span><br><span class="line"><span class="meta"><span class="meta-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span></span><br><span class="line"></span><br><span class="line"><span class="meta"><span class="meta-keyword">import</span> com.ziv.model.User;</span></span><br><span class="line"><span class="meta"><span class="meta-keyword">import</span> com.ziv.repository.UserRepository;</span></span><br><span class="line"></span><br><span class="line">@Controller</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DemoController</span> </span>{</span><br><span class="line"> @Autowired</span><br><span class="line"> <span class="keyword">private</span> UserRepository userRep;</span><br><span class="line"></span><br><span class="line"> @RequestMapping(<span class="string">"/hello"</span>)</span><br><span class="line"> <span class="keyword">public</span> String showDemo(Model model){</span><br><span class="line"> User user = <span class="keyword">new</span> User(<span class="string">"DouDo"</span>,<span class="number">26</span>);</span><br><span class="line"> userRep.save(user);</span><br><span class="line"> model.addAttribute(<span class="string">"User"</span>, user);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Hello"</span>;</span><br><span class="line"> <span class="comment">/*返回的Hello为模板路径,默认配置下只要写`src/main/resources/templates/`路径后的路径,</span></span><br><span class="line"><span class="comment"> 且不需要写后缀(".html")*/</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="4-视图层"><a href="#4-视图层" class="headerlink" title="4. 视图层"></a>4. 视图层</h3><figure class="highlight dust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="xml"><span class="meta"><!DOCTYPE html></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">html</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">head</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">title</span>></span>Demo Test<span class="tag"></<span class="name">title</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"></<span class="name">head</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">body</span>></span></span></span><br><span class="line"><span class="xml"> <span class="tag"><<span class="name">h1</span> <span class="attr">th:text</span>=<span class="string">"'name: '+$</span></span></span><span class="template-variable">{User.name}</span><span class="xml"><span class="tag"><span class="string">"</span>></span><span class="tag"></<span class="name">h1</span>></span></span></span><br><span class="line"><span class="xml"> <span class="tag"><<span class="name">h1</span> <span class="attr">th:text</span>=<span class="string">"'age: '+$</span></span></span><span class="template-variable">{User.age}</span><span class="xml"><span class="tag"><span class="string">"</span>></span><span class="tag"></<span class="name">h1</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"></<span class="name">body</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"></<span class="name">html</span>></span></span></span><br></pre></td></tr></table></figure>
<p>到此,一个简单的spring boot整合Thymeleaf+spring-data-jpa项目便创建好了,运行<code>DemoApplication.java</code>类中的main方法启动程序,在浏览器输入<code>http://localhost:8080/hello</code>便能看到结果:<br><img src="/assets/blogImg/180228/6.png" alt="浏览器展示"></p>
<p>与此同时,数据库中也插入了相应数据:<br><img src="/assets/blogImg/180228/5.png" alt="数据库表相应的数据"></p>
]]></content>
<categories>
<category> Note </category>
</categories>
<tags>
<tag> spring boot </tag>
<tag> Jpa </tag>
<tag> Thymeleaf </tag>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[spring-data-jpa常用注解]]></title>
<url>/2018/02/24/spring-data-jpa%E5%B8%B8%E7%94%A8%E6%B3%A8%E8%A7%A3/</url>
<content type="html"><![CDATA[<p>记录一些spring-data-jpa常用的注解,代码运行环境:spring boot + spring-data-jpa</p>
<h2 id="Entity"><a href="#Entity" class="headerlink" title="@Entity"></a>@Entity</h2><figure class="highlight sqf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">被Entity标注的实体类将会被JPA管理控制,在程序运行时,JPA会识别并映射到指定的数据库表</span><br><span class="line">唯一参数<span class="built_in">name</span>:指定实体类名称,默认为当前实体类的非限定名称。</span><br><span class="line">若给了<span class="built_in">name</span>属性值即@Entity(<span class="built_in">name</span>=<span class="string">"XXX"</span>),则jpa在仓储层(数据层)进行自定义查询时,所查的表名应是XXX。</span><br><span class="line">如:<span class="built_in">select</span> s <span class="keyword">from</span> XXX s</span><br></pre></td></tr></table></figure>
<a id="more"></a>
<h2 id="Table"><a href="#Table" class="headerlink" title="@Table"></a>@Table</h2><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">当你想生成的数据库表名与实体类名称不同时,使用 <span class="variable">@Table</span>(name=<span class="string">"数据库表名"</span>),与<span class="variable">@Entity</span>标注并列使用,置于实体</span><br><span class="line">类声明语句之前</span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line"><span class="variable">@Table</span>(name=<span class="string">"t_student"</span>)</span><br><span class="line">public class student{</span><br><span class="line"> ...</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>@Table中的参数(不常用)</p>
<ul>
<li>catalog: 用于设置表所映射到的数据库的目录</li>
<li>schema: 用于设置表所映射到的数据库的模式</li>
<li>uniqueConstraints: 设置约束条件</li>
</ul>
<h2 id="Id"><a href="#Id" class="headerlink" title="@Id"></a>@Id</h2><figure class="highlight aspectj"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Id</span> 用于实体类的一个属性或者属性对应的getter方法的标注,被标注的的属性将映射为数据库主键</span><br></pre></td></tr></table></figure>
<h2 id="GeneratedValue"><a href="#GeneratedValue" class="headerlink" title="@GeneratedValue"></a>@GeneratedValue</h2><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">与<span class="variable">@Id</span>一同使用,用于标注主键的生成策略,通过 strategy 属性指定。默认是JPA自动选择合适的策略</span><br><span class="line">在 javax.persistence.GenerationType 中定义了以下几种可供选择的策略:</span><br><span class="line"> - IDENTITY:采用数据库ID自增长的方式产生主键,Oracle 不支持这种方式。</span><br><span class="line"> - AUTO: JPA 自动选择合适的策略,是默认选项。</span><br><span class="line"> - SEQUENCE:通过序列产生主键,通过<span class="variable">@SequenceGenerator</span>标注指定序列名,MySQL 不支持这种方式。</span><br><span class="line"> - TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略更易于做数据库移植。</span><br></pre></td></tr></table></figure>
<h2 id="Basic"><a href="#Basic" class="headerlink" title="@Basic"></a>@Basic</h2><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">@Basic</span>表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的 getXxxx() 方法,默认即为<span class="variable">@Basic</span>(fetch=FetechType.EAGER)</span><br><span class="line"><span class="variable">@Basic</span>参数:</span><br><span class="line"> <span class="number">1</span>. fetch 表示该属性的加载读取策略</span><br><span class="line"> <span class="number">1.1</span> EAGER 主动抓取 (默认为EAGER)</span><br><span class="line"> <span class="number">1.2</span> LAZY 延迟加载,只有用到该属性时才会去加载</span><br><span class="line"> <span class="number">2</span>. optional (默认为 true)</span><br><span class="line"> 表示该属性是否允许为null</span><br></pre></td></tr></table></figure>
<h2 id="Column"><a href="#Column" class="headerlink" title="@Column"></a>@Column</h2><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">通常置于实体的属性声明之前,可与 <span class="variable">@Id</span> 标注一起使用</span><br><span class="line"><span class="variable">@Column</span>参数:</span><br><span class="line"> <span class="number">1</span>. <span class="attribute">name</span>: 指定映射到数据库中的字段名</span><br><span class="line"> <span class="number">2</span>. <span class="attribute">unique</span>: 是否唯一,默认为false</span><br><span class="line"> <span class="number">3</span>. <span class="attribute">nullable</span>: 是否允许为null,默认为true</span><br><span class="line"> <span class="number">5</span>. <span class="attribute">insertable</span>: 是否允许插入,默认为true</span><br><span class="line"> <span class="number">6</span>. <span class="attribute">updatetable</span>: 是否允许更新,默认为true</span><br><span class="line"> <span class="number">7</span>. <span class="attribute">columnDefinition</span>: 指定该属性映射到数据库中的实际类型,通常是自动判断。</span><br></pre></td></tr></table></figure>
<h2 id="Transient"><a href="#Transient" class="headerlink" title="@Transient"></a>@Transient</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">JPA会忽略该属性,不会映射到数据库中,即程序运行后数据库中将不会有该字段</span><br></pre></td></tr></table></figure>
<h2 id="Temporal"><a href="#Temporal" class="headerlink" title="@Temporal"></a>@Temporal</h2><figure class="highlight haml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Java中没有定义 Date 类型的精度,而数据库中,表示时间类型的数据有 DATE,TIME,TIMESTAMP三种精度</span><br><span class="line"> -<span class="ruby"> @Temporal(TemporalType.DATE) 表示映射到数据库中的时间类型为 DATE,只有日期</span></span><br><span class="line"><span class="ruby"> - @Temporal(TemporalType.TIME) 表示映射到数据库中的时间类型为 TIME,只有时间</span></span><br><span class="line"><span class="ruby"> - @Temporal(TemporalType.TIMESTAMP) 表示映射到数据库中的时间类型为 TIMESTAMP,日期和时间都有</span></span><br></pre></td></tr></table></figure>
<h2 id="Embedded-和-Embeddable"><a href="#Embedded-和-Embeddable" class="headerlink" title="@Embedded 和 @Embeddable"></a>@Embedded 和 @Embeddable</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">用于一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表</span><br></pre></td></tr></table></figure>
<p>网上有一份比较详细说明,可参考<a href="http://blog.csdn.net/lmy86263/article/details/52108130" target="_blank" rel="noopener">链接</a></p>
<h2 id="JoinColumn"><a href="#JoinColumn" class="headerlink" title="@JoinColumn"></a>@JoinColumn</h2><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">定义表关联的外键字段名</span><br><span class="line">常用参数有:</span><br><span class="line"> <span class="number">1.</span> <span class="string">name:</span> 指定映射到数据库中的外键的字段名</span><br><span class="line"> <span class="number">2.</span> <span class="string">unique:</span> 是否唯一,默认为<span class="literal">false</span></span><br><span class="line"> <span class="number">3.</span> <span class="string">nullable:</span> 是否允许为<span class="literal">null</span>,默认为<span class="literal">true</span></span><br><span class="line"> <span class="number">4.</span> <span class="string">insertable:</span> 是否允许插入,默认为<span class="literal">true</span></span><br><span class="line"> <span class="number">5.</span> <span class="string">updatetable:</span> 是否允许更新,默认为<span class="literal">true</span></span><br><span class="line"> <span class="number">6.</span> <span class="string">columnDefinition:</span> 指定该属性映射到数据库中的实际类型,通常是自动判断。</span><br></pre></td></tr></table></figure>
<h2 id="OneToOne"><a href="#OneToOne" class="headerlink" title="@OneToOne"></a>@OneToOne</h2><p>参数:</p>
<ul>
<li>targetEntity: 指定关联实体类型,默认为被注解的属性或方法所属的类</li>
<li>cascade: 级联操作策略 <ol>
<li>CascadeType.ALL 级联所有操作</li>
<li>CascadeType.PERSIST 级联新增</li>
<li>CascadeType.MERGE 级联归并更新</li>
<li>CascadeType.REMOVE 级联删除</li>
<li>CascadeType.REFRESH 级联刷新</li>
<li>CascadeType.DETACH 级联分离</li>
</ol>
</li>
<li>fetch: fetch 表示该属性的加载读取策略 (默认值为 <code>EAGER</code>)<ol>
<li>EAGER 主动抓取</li>
<li>LAZY 延迟加载,只有用到该属性时才会去加载 </li>
</ol>
</li>
<li>optional: 默认为true,关联字段是否为空<br> 如果为false,则常与@JoinColumn一起使用</li>
<li>mappedBy: 指定关联关系,该参数只用于关联关系被拥有方<br>只用于双向关联<code>@OneToOne</code>,<code>@OneToMany</code>,<code>@ManyToMany</code>。而<code>@ManyToOne</code>中没有<br> @OneToOne(mappedBy = “xxx”)<br> 表示xxx所对应的类为关系被拥有方,而关联的另一方为关系拥有方 <ul>
<li>关系拥有方:对应拥有外键的数据库表</li>
<li>关系被拥有方:对应主键被子表引用为外键的数据库表</li>
</ul>
</li>
<li>orphanRemoval:默认值为false<br>判断是否自动删除与关系拥有方不存在联系的关系被拥有方(关系被拥有方的一个主键在关系拥有方中未被引用,<br>当jpa执行更新操作时,是否删除数据库中此主键所对应的一条记录,若为true则删除) </li>
</ul>
<figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//单向 一对一</span></span><br><span class="line"><span class="variable">@Entity</span> </span><br><span class="line">public class Emp{<span class="comment">//员工</span></span><br><span class="line"> <span class="variable">@Id</span></span><br><span class="line"> <span class="variable">@GeneratedValue</span></span><br><span class="line"> privte Integer eId;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@Column</span>(length = <span class="number">40</span>)</span><br><span class="line"> private String empName;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@OneToOne</span>(cascade = CascadeType.ALL)</span><br><span class="line"> private Identity identity;</span><br><span class="line"> <span class="comment">//get,set方法省略</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Identity{<span class="comment">//身份证</span></span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//双向 一对一</span></span><br><span class="line"><span class="variable">@Entity</span> </span><br><span class="line">public class Emp{</span><br><span class="line"> <span class="variable">@Id</span></span><br><span class="line"> <span class="variable">@GeneratedValue</span></span><br><span class="line"> privte Integer eId;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@Column</span>(length = <span class="number">40</span>)</span><br><span class="line"> private String empName;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@OneToOne</span>(cascade = CascadeType.ALL)</span><br><span class="line"> private Identity identity;</span><br><span class="line"> <span class="comment">//get,set方法省略</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Identity{</span><br><span class="line"> <span class="variable">@Id</span></span><br><span class="line"> <span class="variable">@GeneratedValue</span></span><br><span class="line"> privte Integer iId;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@OneToOne</span>(cascade = CascadeType.ALL, mappedBy = <span class="string">"identity"</span>)</span><br><span class="line"> private Emp emp;</span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>以上例子,双向一对一,Emp 为关系拥有方,Identity 为关系被拥有方。<br>执行spring-data-jpa新增操作时,如果通过Identity的数据访问层进行新增操作(IdentityRepository.save())<br>,Emp表和Identity表都有数据,但是不会设置这两条数据的关系,Emp表中的外键为null。<br>反之,以关系拥有方Emp的数据访问层进行新增操作(EmpRepository.save()),Emp表和Identity表都有数据,并且<br>设置了两条数据的关系,即Emp表中的外键也得到正确新增</p>
<h2 id="ManyToOne、-OneToMany"><a href="#ManyToOne、-OneToMany" class="headerlink" title="@ManyToOne、@OneToMany"></a>@ManyToOne、@OneToMany</h2><p>多对一(也可叫一对多,只是前后表颠倒一下而已),只有双向多对一时才用得到@OneToMany。多对一中多的一方必定是对应数据库中拥有外键的表,即是关系拥有方,<code>@ManyToOne</code>只用在多对一中代表多的一类中,因为<code>mappedBy</code>只用于关系被拥有方,所以<code>@ManyToOne</code>参数中不包含<code>mappedBy</code>。 </p>
<p><code>@ManyToOne</code>参数:</p>
<ul>
<li>targetEntity: 指定关联实体类型,默认为被注解的属性或方法所属的类</li>
<li>cascade: 级联操作策略 <ol>
<li>CascadeType.ALL 级联所有操作</li>
<li>CascadeType.PERSIST 级联新增</li>
<li>CascadeType.MERGE 级联归并更新</li>
<li>CascadeType.REMOVE 级联删除</li>
<li>CascadeType.REFRESH 级联刷新</li>
<li>CascadeType.DETACH 级联分离</li>
</ol>
</li>
<li>fetch: fetch 表示该属性的加载读取策略(@ManyToOne 的默认值是 <code>EAGER</code>,@OneToMany 的默认值是 <code>LAZY</code>) <ol>
<li>EAGER 主动抓取</li>
<li>LAZY 延迟加载,只有用到该属性时才会去加载 </li>
</ol>
</li>
<li>optional: 默认为true,关联字段是否为空<br> 如果为false,则常与@JoinColumn一起使用 </li>
</ul>
<p><code>@OneToMany</code> 参数除上述以外还有:</p>
<ul>
<li>mappedBy: 指定关联关系,该参数只用于关联关系被拥有方<br>只用于双向关联<code>@OneToOne</code>,<code>@OneToMany</code>,<code>@ManyToMany</code>。而<code>@ManyToOne</code>中没有<br> @OneToMany(mappedBy = “xxx”)<br> 表示xxx所对应的类为关系被拥有方,而关联的另一方为关系拥有方 <ul>
<li>关系拥有方:对应拥有外键的数据库表</li>
<li>关系被拥有方:对应主键被子表引用为外键的数据库表</li>
</ul>
</li>
<li>orphanRemoval:默认值为false<br>判断是否自动删除与关系拥有方不存在联系的关系被拥有方(关系被拥有方的一个主键在关系拥有方中未被引用,<br>当jpa执行更新操作时,是否删除数据库中此主键所对应的一条记录,若为true则删除)</li>
</ul>
<figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//单向 多对一</span></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Emp{</span><br><span class="line"> <span class="variable">@Id</span></span><br><span class="line"> <span class="variable">@GeneratedValue</span></span><br><span class="line"> privte Integer eId;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@Column</span>(length = <span class="number">40</span>)</span><br><span class="line"> private String empName;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@ManyToOne</span>(cascade = CascadeType.ALL)</span><br><span class="line"> private Dept dept;</span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Dept{</span><br><span class="line"> <span class="variable">@Id</span></span><br><span class="line"> <span class="variable">@GeneratedValue</span></span><br><span class="line"> privte Integer dId;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@Column</span>(length = <span class="number">40</span>)</span><br><span class="line"> private String deptName;</span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//双向 多对一</span></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Emp{</span><br><span class="line"> <span class="variable">@Id</span></span><br><span class="line"> <span class="variable">@GeneratedValue</span></span><br><span class="line"> privte Integer eId;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@Column</span>(length = <span class="number">40</span>)</span><br><span class="line"> private String empName;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@ManyToOne</span>(cascade = CascadeType.ALL)</span><br><span class="line"> private Emp emp;</span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Dept{</span><br><span class="line"> <span class="variable">@Id</span></span><br><span class="line"> <span class="variable">@GeneratedValue</span></span><br><span class="line"> privte Integer dId;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@Column</span>(length = <span class="number">40</span>)</span><br><span class="line"> private String deptName;</span><br><span class="line"></span><br><span class="line"> <span class="variable">@OneToMany</span>(cascade = CascadeType.ALL, mappedBy = <span class="string">"emp"</span>)</span><br><span class="line"> private List<Emp> emps;</span><br><span class="line"> <span class="comment">//省略get、set方法</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p> 无论双向关联还是单向关联,数据库中均会在Emp表中自动生成一个外键(dept_d_id)</p>
<h2 id="ManyToMany"><a href="#ManyToMany" class="headerlink" title="@ManyToMany"></a>@ManyToMany</h2><ul>
<li>targetEntity: 指定关联实体类型,默认为被注解的属性或方法所属的类</li>
<li>cascade: 级联操作策略 <ol>
<li>CascadeType.ALL 级联所有操作</li>
<li>CascadeType.PERSIST 级联新增</li>
<li>CascadeType.MERGE 级联归并更新</li>
<li>CascadeType.REMOVE 级联删除</li>
<li>CascadeType.REFRESH 级联刷新</li>
<li>CascadeType.DETACH 级联分离</li>
</ol>
</li>
<li>fetch: fetch 表示该属性的加载读取策略 (默认值为 <code>LAZY</code>)<ol>
<li>EAGER 主动抓取 </li>
<li>LAZY 延迟加载,只有用到该属性时才会去加载 </li>
</ol>
<ul>
<li>mappedBy: 指定关联关系,该参数只用于关联关系被拥有方<br>只用于双向关联<code>@OneToOne</code>,<code>@OneToMany</code>,<code>@ManyToMany</code>。而<code>@ManyToOne</code>中没有。<br> @ManyToMany(mappedBy = “xxx”)<br> 表示xxx所对应的类为关系被拥有方,而关联的另一方为关系拥有方:<ul>
<li>关系拥有方:对应拥有外键的数据库表</li>
<li>关系被拥有方:对应主键被子表引用为外键的数据库表</li>
</ul>
</li>
</ul>
</li>
</ul>
<figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//单向 多对多</span></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Student{</span><br><span class="line"> <span class="variable">@ManyToMany</span>(cascade = CascadeType.ALL)</span><br><span class="line"> private List<Course> courses;</span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Course{</span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//双向 多对多</span></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Student{</span><br><span class="line"> <span class="variable">@ManyToMany</span>(cascade = CascadeType.ALL)</span><br><span class="line"> private List<Course> courses;</span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="variable">@Entity</span></span><br><span class="line">public class Course{</span><br><span class="line"> <span class="variable">@ManyToMany</span>(cascade = CascadeType.ALL, mappedBy = <span class="string">"courses"</span>)</span><br><span class="line"> private List<Student> students;</span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<blockquote>
<p>所有双向关联使用时需谨慎,查询时容易引起栈内存溢出,尽量使用单向关联</p>
</blockquote>
<h2 id="Enumerated"><a href="#Enumerated" class="headerlink" title="@Enumerated"></a>@Enumerated</h2><p>当实体类中有枚举类型的属性时,默认情况下自动生成的数据库表中对应的字段类型是枚举的索引值,是数字类型的,若希望数据库中存储的是枚举对应的String类型,在属性上加入<code>@Enumerated(EnumType.STRING)</code>注解即可。<br><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">@Enumerated</span>(EnumType.STRING)</span><br><span class="line"><span class="variable">@Column</span>(nullable = true)</span><br><span class="line">private RoleEnum role;</span><br></pre></td></tr></table></figure></p>
]]></content>
<categories>
<category> Note </category>
</categories>
<tags>
<tag> jpa </tag>
<tag> 注解 </tag>
<tag> 数据库 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[spring-data-jpa双向表关联查询时引发异常:java.lang.StackOverflowError: null]]></title>
<url>/2018/02/01/spring-data-jpa%E5%8F%8C%E5%90%91%E8%A1%A8%E5%85%B3%E8%81%94%E6%9F%A5%E8%AF%A2%E6%97%B6%E5%BC%95%E5%8F%91%E5%BC%82%E5%B8%B8%EF%BC%9Ajava-lang-StackOverflowError-null/</url>
<content type="html"><![CDATA[<blockquote>
<p>工作时不忘学习,学习时不忘记笔记。 </p>
</blockquote>
<h3 id="项目异常如下:"><a href="#项目异常如下:" class="headerlink" title="项目异常如下:"></a>项目异常如下:</h3><figure class="highlight xl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">2018</span>-<span class="number">01</span>-<span class="number">26</span> <span class="number">17</span>:<span class="number">12</span>:<span class="number">38.162</span> WARN <span class="number">3128</span> --- [<span class="function"><span class="title">nio</span>-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could <span class="built_in">not</span> write JSON: Infinite recursion (StackOverflowError); nested exception <span class="keyword">is</span> com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: demo.server.core.domain.User["userAddresses"]-></span></span><br><span class="line"><span class="function"><span class="title">org</span>.hibernate.collection.internal.PersistentBag[0]-></span></span><br><span class="line"><span class="function"><span class="title">demo</span>.server.core.domain.UserAddress["user"]-></span></span><br><span class="line"><span class="function"><span class="title">demo</span>.server.core.domain.User["userAddresses"]-></span></span><br><span class="line"><span class="function"><span class="title">org</span>.hibernate.collection.internal.PersistentBag[0]-></span></span><br><span class="line"><span class="function"><span class="title">demo</span>.server.core.domain.UserAddress["user"]-></span></span><br><span class="line">......<span class="comment">//无限递归</span></span><br></pre></td></tr></table></figure>
<a id="more"></a>
<figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">java<span class="selector-class">.lang</span><span class="selector-class">.StackOverflowError</span>: null</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.ClassLoader</span><span class="selector-class">.defineClass1</span>(Native Method) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.ClassLoader</span><span class="selector-class">.defineClass</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.security</span><span class="selector-class">.SecureClassLoader</span><span class="selector-class">.defineClass</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.net</span><span class="selector-class">.URLClassLoader</span><span class="selector-class">.defineClass</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.net</span><span class="selector-class">.URLClassLoader</span><span class="selector-class">.access</span>$<span class="number">100</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.net</span><span class="selector-class">.URLClassLoader</span>$<span class="number">1</span>.run(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.net</span><span class="selector-class">.URLClassLoader</span>$<span class="number">1</span>.run(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.security</span><span class="selector-class">.AccessController</span><span class="selector-class">.doPrivileged</span>(Native Method) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.net</span><span class="selector-class">.URLClassLoader</span><span class="selector-class">.findClass</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.ClassLoader</span><span class="selector-class">.loadClass</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at sun<span class="selector-class">.misc</span><span class="selector-class">.Launcher</span><span class="variable">$AppClassLoader</span>.loadClass(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.ClassLoader</span><span class="selector-class">.loadClass</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at com<span class="selector-class">.fasterxml</span><span class="selector-class">.jackson</span><span class="selector-class">.databind</span><span class="selector-class">.ser</span><span class="selector-class">.std</span><span class="selector-class">.BeanSerializerBase</span><span class="selector-class">.serializeFields</span>(BeanSerializerBase<span class="selector-class">.java</span>:<span class="number">709</span>) ~[jackson-databind-<span class="number">2.8</span>.<span class="number">1</span><span class="selector-class">.jar</span>:<span class="number">2.8</span>.<span class="number">1</span>]</span><br><span class="line"> at com<span class="selector-class">.fasterxml</span><span class="selector-class">.jackson</span><span class="selector-class">.databind</span><span class="selector-class">.ser</span><span class="selector-class">.BeanSerializer</span><span class="selector-class">.serialize</span>(BeanSerializer<span class="selector-class">.java</span>:<span class="number">155</span>) ~[jackson-databind-<span class="number">2.8</span>.<span class="number">1</span><span class="selector-class">.jar</span>:<span class="number">2.8</span>.<span class="number">1</span>]</span><br><span class="line"> at com<span class="selector-class">.fasterxml</span><span class="selector-class">.jackson</span><span class="selector-class">.databind</span><span class="selector-class">.ser</span><span class="selector-class">.std</span><span class="selector-class">.CollectionSerializer</span><span class="selector-class">.serializeContents</span>(CollectionSerializer<span class="selector-class">.java</span>:<span class="number">149</span>) ~[jackson-databind-<span class="number">2.8</span>.<span class="number">1</span><span class="selector-class">.jar</span>:<span class="number">2.8</span>.<span class="number">1</span>]</span><br><span class="line"> at</span><br><span class="line">...</span><br></pre></td></tr></table></figure>
<p>看异常的名字会发现是栈溢出,而且第一处后面出现大量的递归的提示,这边的原因是因为使用了jpa的实体类注解@ManyToMany,@ManyToOne,@OneToOne并且是双向表关联</p>
<h3 id="举个例子:"><a href="#举个例子:" class="headerlink" title="举个例子:"></a>举个例子:</h3><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">@Entity</span></span><br><span class="line"><span class="variable">@Table</span>(name = <span class="string">"t_student"</span>)</span><br><span class="line">public class Student{</span><br><span class="line"> <span class="variable">@Id</span></span><br><span class="line"> <span class="variable">@GeneratedValue</span></span><br><span class="line"> private Integer sId;</span><br><span class="line"> <span class="variable">@Column</span>(length = <span class="number">20</span>)</span><br><span class="line"> private String sName;</span><br><span class="line"> <span class="comment">//学生所修课程</span></span><br><span class="line"> <span class="variable">@ManyToMany</span>(mappedBy = <span class="string">"students"</span>)</span><br><span class="line"> private List<Course> courses;</span><br><span class="line"> <span class="comment">//get、set 方法省略</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">@Entity</span></span><br><span class="line"><span class="variable">@Table</span>(name = <span class="string">"t_course"</span>)</span><br><span class="line">public class Course{</span><br><span class="line"> <span class="variable">@Id</span></span><br><span class="line"> <span class="variable">@GeneratedValue</span></span><br><span class="line"> private Integer cId;</span><br><span class="line"> <span class="variable">@Column</span>(length = <span class="number">20</span>)</span><br><span class="line"> private String cName;</span><br><span class="line"> <span class="comment">//上课的学生</span></span><br><span class="line"> <span class="variable">@ManyToMany</span>(cascade = CascadeType.ALL)</span><br><span class="line"> private List<Student> students;</span><br><span class="line"> <span class="comment">//get、set 方法省略</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>一个student类和一个course类分别对应 t_student 表和 t_course表,它们是多对多的关系,一个学生可以修多个课程,一个课程可以有多个学生修</p>
<h3 id="省略仓储层代码…"><a href="#省略仓储层代码…" class="headerlink" title="省略仓储层代码…"></a>省略仓储层代码…</h3><h3 id="控制层代码"><a href="#控制层代码" class="headerlink" title="控制层代码"></a>控制层代码</h3><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">TestController</span></span>{</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> StudentRepository studentRep;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@RequestMapping(<span class="meta-string">"/test"</span>)</span></span><br><span class="line"> <span class="keyword">public</span> int test(){</span><br><span class="line"> List<Student> students = stntRep.findAll();</span><br><span class="line"> students.forEach(<span class="keyword">data</span>->{</span><br><span class="line"> System.<span class="keyword">out</span>.println(<span class="keyword">data</span>);</span><br><span class="line"> });</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>此时,程序运行便会报 java.lang.StackOverflowError: null 异常<br><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">java<span class="selector-class">.lang</span><span class="selector-class">.StackOverflowError</span>: null</span><br><span class="line"> at java<span class="selector-class">.util</span><span class="selector-class">.AbstractCollection</span><span class="selector-class">.toString</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at org<span class="selector-class">.hibernate</span><span class="selector-class">.collection</span><span class="selector-class">.internal</span><span class="selector-class">.PersistentBag</span><span class="selector-class">.toString</span>(PersistentBag<span class="selector-class">.java</span>:<span class="number">510</span>) ~[hibernate-core-<span class="number">5.0</span>.<span class="number">12</span><span class="selector-class">.Final</span><span class="selector-class">.jar</span>:<span class="number">5.0</span>.<span class="number">12</span>.Final]</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.String</span><span class="selector-class">.valueOf</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.StringBuilder</span><span class="selector-class">.append</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at com<span class="selector-class">.demo</span><span class="selector-class">.domain</span><span class="selector-class">.Course</span><span class="selector-class">.toString</span>(Course<span class="selector-class">.java</span>:<span class="number">38</span>) ~[classes/:na]</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.String</span><span class="selector-class">.valueOf</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.StringBuilder</span><span class="selector-class">.append</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.util</span><span class="selector-class">.AbstractCollection</span><span class="selector-class">.toString</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at org<span class="selector-class">.hibernate</span><span class="selector-class">.collection</span><span class="selector-class">.internal</span><span class="selector-class">.PersistentBag</span><span class="selector-class">.toString</span>(PersistentBag<span class="selector-class">.java</span>:<span class="number">510</span>) ~[hibernate-core-<span class="number">5.0</span>.<span class="number">12</span><span class="selector-class">.Final</span><span class="selector-class">.jar</span>:<span class="number">5.0</span>.<span class="number">12</span>.Final]</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.String</span><span class="selector-class">.valueOf</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at java<span class="selector-class">.lang</span><span class="selector-class">.StringBuilder</span><span class="selector-class">.append</span>(Unknown Source) ~[na:<span class="number">1.8</span>.<span class="number">0</span>_111]</span><br><span class="line"> at com<span class="selector-class">.demo</span><span class="selector-class">.domain</span><span class="selector-class">.Student</span><span class="selector-class">.toString</span>(Student<span class="selector-class">.java</span>:<span class="number">40</span>) ~[classes/:na]</span><br><span class="line"> ....</span><br></pre></td></tr></table></figure></p>
<p>Student类中有一个字段<code>List<Course> courses</code>,在遍历集合中,输出一个<code>student</code>实例的时候,<code>List<Course> courses</code> 字段也将输出,因为是双向多对多的关联查询,每一个<code>Course</code>实例也会输出<code>List<Student> students</code> 字段值,因此一直递归下去直到栈溢出报错,若是单向多对多就不会发生这样地递归</p>
<p>其实一开始报这个错完全是因为对spring-data-jpa不熟悉,了解之后一想就通了。</p>
<h3 id="解决办法:"><a href="#解决办法:" class="headerlink" title="解决办法:"></a>解决办法:</h3><p>方法一:<br>此处,若不需要查看关联表中的字段信息时,可以在遍历<code>List<Student> students</code>集合时先将关联对象设置为<code>null</code>,即:<br><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">students.forEach(<span class="keyword">data</span>->{</span><br><span class="line"> <span class="keyword">data</span>.setCourses(<span class="literal">null</span>);</span><br><span class="line"> System.<span class="keyword">out</span>.println(<span class="keyword">data</span>);</span><br><span class="line">});</span><br></pre></td></tr></table></figure></p>
<p>这样才能打印出<code>Student</code> 实例中除了<code>courses</code> 字段之外地所有数据</p>
<p>方法二:<br>取消使用双向多对多关联,改为使用单向多对多,这样也可以同时将关联表中所对应的数据查询出来使用</p>
]]></content>
<categories>
<category> Note </category>
</categories>
<tags>
<tag> 异常 </tag>
<tag> jpa </tag>
<tag> Java </tag>
<tag> spring-boot </tag>
</tags>
</entry>
<entry>
<title><![CDATA[现在的我,左手写代码,右手写诗]]></title>
<url>/2018/01/11/%E7%8E%B0%E5%9C%A8%E7%9A%84%E6%88%91%EF%BC%8C%E5%B7%A6%E6%89%8B%E5%86%99%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%8F%B3%E6%89%8B%E5%86%99%E8%AF%97/</url>
<content type="html"><![CDATA[<p>现在的我,左手写代码,右手写诗</p>
<p>已经分不清是日子变了还是人变了,<br>也许是日子变了,<br>以前,总是倒头就睡,一觉睡到自然醒,<br>现在,为了养成一个好的生活习惯,设置了两个闹钟,一个提示起床,一个提示早点睡觉。<br><a id="more"></a><br>或许是因为一段经历告诉我有些习惯该改改了。<br><br></p>
<p>也许是人变了<br>每天夜里,戴上耳机,听你喜欢的歌,<br>想着,时间要是没有流走,世界还定格在那一刻,<br>我在我的人生画幅里第一次找到你的提笔处,那时我必定会换支画笔来描绘我的未来,一个有你的未来。<br>然后,描绘着描绘着就睡着了,很美的进入梦乡。<br>在梦里,偶尔让我实现一次这样的美梦,<br>这样的美梦总会让我醒来时对生活充满了期待,也充满了斗志。<br><br></p>
<p>对比过去和现在,<br>以前,身边的话题是各种游戏,电影……<br>现在,变成汽车,房子,结婚……<br>以前,感叹学业多,考试多,<br>现在,感叹房价涨的有多快。<br>以前,遇到喜欢的女孩子,敢鼓足勇气去表白,<br>现在,结束了一段情感,却迟迟不愿走出来。<br>以前,喜欢乱买东西,<br>现在,月初计算,这个月还了信用卡,交了房租,还剩多少够平时消费的。<br>以前,孤独了,至少还有同学、室友,<br>现在,除了工作时,都是一个人。<br><img src="/assets/blogImg/now.jpg" alt=""><br><br></p>
<p>回到现实,<br>工作和生活上,<br>少了一些轻狂,多了一点沉稳,<br>少了一些任性,多了一点包容,<br>少了一些软弱,多了一点坚强,<br>少了一些高傲,多了一点谦虚,<br>试着去忍耐一些挫折,不再抱怨诸多的不是。<br>只是,<br>有时候,明明很想哭,却强扭着笑,<br>有时候,明明很在乎,却装作无所谓,<br>有时候,明明很痛苦,却骗自己说很幸福,<br>忘不掉的,说已经忘了,却还是每天晚上都会想,<br>放不下的,说你我已是路人,却还是偶尔打开那个相册,<br>删了微信和QQ好友,<br>却又开通了微博,关注了网易云,<br>只是想知道你过的如何。<br><br></p>
<p>孤单的一个人在外面,<br>最暖心的就只剩与爸妈的通信了,<br>也不知从何时起,与爸妈的通信也发生了变化,<br>以前,通信内容往往是诉说,在外遇到挫折,生活费不够了,一条短信、一段电话寻求世上最可靠的帮助。<br>现在,通信内容变成了问候:爸,妈,最近可好?别太累着,记得按时休息,我这边一切都好。<br>其实心里也有苦楚,只是说不出,怕他们担心罢了。<br>偶尔那头传来渴望的话语:儿子,什么时候找个女朋友啊?<br>我却只能说:社会变了,现在婚龄变高了,我现在还年轻,你们别急,迟早会有的……此时内心更多的只有愧疚,因为时常听他们说道,你那个同学结婚了,这个同学前不久刚刚生娃了。<br>内心也是许着:不会让你们等太久,以后要让你们过上舒舒服服的日子。<br><br></p>
<p>现在的我,<br>一个人吃饭,一个人看电影,一个人承担压力,<br>累了就想一些美好的。<br><img src="/assets/blogImg/CatWithPeople.jfif" alt=""></p>
<p>现在的我,<br>每天早上,带着你给我的温暖微笑着跟见到的每一个人说:你好!<br><br><br>现在的我,<br>过的很好,生活规律,偶尔想家,偶尔想你。</p>
<p><br><br><br><br><br><br><br><br>读《我今年,二十七八岁》有感而发</p>
]]></content>
<categories>
<category> Essay </category>
</categories>
</entry>
<entry>
<title><![CDATA[Hexo+Github Page搭建个人博客]]></title>
<url>/2018/01/02/set-up-personalBlog/</url>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>前两天刚刚搭建好这个博客,想着趁热乎,脑中还记得一些搭建时需要在意的注意点啥的。于是,便有了下文。只是希望能够给以后想自己搭建博客的人一点微不足道的帮助。有什么不对的地方可以留言告诉我。</p>
<a id="more"></a>
<h1 id="博客搭建"><a href="#博客搭建" class="headerlink" title="博客搭建"></a>博客搭建</h1><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a><font color="#0099ff">准备工作</font></h2><p>此教程中的博客是在Windows系统下搭建的,git用的是命令行而非图形化处理界面</p>
<ul>
<li>git(必需)</li>
<li>node.js (必需)</li>
<li>Github账号(必需)</li>
<li>markdown编辑器(最好有一个,以后也方便写博客)</li>
<li>域名 </li>
</ul>
<h2 id="git下载并安装"><a href="#git下载并安装" class="headerlink" title="git下载并安装"></a><font color="#0099ff">git下载并安装</font></h2><p>作用:将本地hexo代码提交到GitHub上,(关于git,不了解的可以参考<a href="http://blog.csdn.net/v123411739/article/details/44071059/" target="_blank" rel="noopener">史上最全github使用方法:github入门到精通</a>也可自行搜索获或者去<a href="https://git-scm.com/" target="_blank" rel="noopener">官网</a>看看)<br><a href="https://git-scm.com/download/win" target="_blank" rel="noopener">下载</a> 好相对应的git版本并安装,安装时按默认选项安装即可</p>
<h2 id="node-js下载并安装"><a href="#node-js下载并安装" class="headerlink" title="node.js下载并安装"></a><font color="#0099ff">node.js下载并安装</font></h2><p>同样,<a href="https://nodejs.org/en/" target="_blank" rel="noopener">下载</a> 好,安装时同样可按默认选项安装即可</p>
<blockquote>
<p>注:以上需要安装的步骤,若安装时出现问题请自行查询相关解决办法,此处不再详细说明</p>
</blockquote>
<h2 id="Github账号"><a href="#Github账号" class="headerlink" title="Github账号"></a><font color="#0099ff">Github账号</font></h2><p>申请GitHub之后即可建立个人远程库,用来做个人博客的服务器,以及生成GitHub域名,<a href="https://pages.github.com/" target="_blank" rel="noopener">可以参考此</a><br>申请GitHub账号我就不多说了</p>
<h2 id="安装Hexo"><a href="#安装Hexo" class="headerlink" title="安装Hexo"></a><font color="#0099ff">安装Hexo</font></h2><p>Hexo使用可以参考 <a href="https://hexo.io/zh-cn/docs/index.html" target="_blank" rel="noopener"><code>Hexo document</code></a></p>
<blockquote>
<p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。($为git命令行自带不需手动输入,只需输入$后面的,以下所有命令皆是)</p>
</blockquote>
<p><strong>①</strong> 鼠标右击桌面或其他任意地方,选择Git Bash Here,使用以下命令进行安装hexo<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> npm install hexo-cli -g</span></span><br></pre></td></tr></table></figure></p>
<p><strong>②</strong> 创建放置博客源码的文件夹:hexo文件夹<br>在自己想要的位置创建文件夹,建议放在英文文件夹目录下。如:E:\hexo</p>
<p><strong>③</strong> 打开刚刚新建的hexo文件夹(此时文件夹需为空),右击选择Git Bash Here执行以下命令<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> hexo init</span></span><br></pre></td></tr></table></figure></p>
<p>回车之后Hexo会自动在该文件夹下下载搭建网站所需的文件</p>
<p><strong>④</strong> 安装依赖包<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> npm install</span></span><br></pre></td></tr></table></figure></p>
<p><strong>⑤</strong> 生成静态文件<br><figure class="highlight verilog"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo <span class="keyword">generate</span> (或者输入 hexo g)</span><br></pre></td></tr></table></figure></p>
<p><strong>⑥</strong> 启动本地服务器<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo<span class="built_in"> server </span>(或者输入 hexo s)</span><br></pre></td></tr></table></figure></p>
<p>默认情况下,访问地址为:<code>http://localhost:4000/</code><br>此时git命令行显示如下:<br><img src="/assets/blogImg/hexo s.png" alt=""><br>由提示可以看出,hexo服务器已启动,并提示你按<code>Ctrl + C</code>来停止服务器</p>
<p>好了,运行到此,其实我们已经可以看到我们搭建的博客的雏形了,打开浏览器,在地址栏输入<code>http://localhost:4000/</code>在正常操作的情况下,此时你应该可以看到一个类似下面的图片的界面。这就是刚刚在本地建立的博客,别人无法访问。<br>页面如下:<br><img src="/assets/blogImg/first.png" alt=""></p>
<p>这边我是将我现在的博客主题切换为默认主题时的样子,所以title和subtitle是被我修改过的,这些可在E:\hexo目录下的_config.yml配置文件中修改,进去找到相应的字段在其后面添加你的文字即可(<code>:</code>后同样需要加空格)</p>
<h2 id="注册Github账号"><a href="#注册Github账号" class="headerlink" title="注册Github账号"></a><font color="#0099ff">注册Github账号</font></h2><p>已有Github账号跳过此步骤,点击<a href="https://github.com/" target="_blank" rel="noopener">github</a>进入注册页面</p>
<h2 id="创建repository"><a href="#创建repository" class="headerlink" title="创建repository"></a><font color="#0099ff">创建repository</font></h2><p>repository作为一个远程的仓储室,即一个远程仓库,用来放置你上传的源码<br><img src="/assets/blogImg/repository1.png" alt=""> </p>
<p>按照途中数字顺序进行操作,第③步时,blog为你想取的repository名,<code>.github.io</code>别忘了加上,后面设置需要<br><img src="/assets/blogImg/repository2.png" alt=""></p>
<h2 id="部署本地文件到github"><a href="#部署本地文件到github" class="headerlink" title="部署本地文件到github"></a><font color="#0099ff">部署本地文件到github</font></h2><p>远程仓库和本地仓库都创建好了,剩下的就是建立将本地代码提交到远程仓库的路径了,如此才能连接本地仓库和远程github提供的仓库。打开<code>E:\hexo</code>(刚刚新建的生成本地博客代码的文件夹)下的<code>_config.yml</code>文件,因为是mackdown文件,为了编辑方便,可以下载一个<a href="https://notepad-plus-plus.org/download/v7.5.4.html" target="_blank" rel="noopener">Notepad++</a>,<br>一般是在_config.yml最下方,添加如下配置<br><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">deploy</span>:</span><br><span class="line"> <span class="attribute">type</span>: git</span><br><span class="line"> <span class="attribute">repository</span>: <span class="attribute">http</span>:<span class="comment">//github.com/username/blog.github.io.git</span></span><br><span class="line"> <span class="attribute">branch</span>: master</span><br></pre></td></tr></table></figure></p>
<blockquote>
<p>每个<code>:</code>后必须带一个空格<br>repository后的<code>username</code>为GitHub用户名,第二个为之前创建的Repository的名字,记得修改为自己的。上面提到创建repository时填写Repository name要加个<code>.github.io</code>我一开始没加,自然这边也就没加,导致部署到GitHub page上后打开我的远程博客时报404,折腾了一会儿,在这边添加了这个之后问题解决,这还是因为对github不够了解,惭愧。</p>
</blockquote>
<p>配置好之后执行以下代码<br><figure class="highlight verilog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ hexo <span class="keyword">generate</span> (或者输入 hexo g)</span><br><span class="line">$ hexo deploy (或者输入 hexo d)</span><br></pre></td></tr></table></figure></p>
<p>上面两行也可简写为<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> hexo g -d</span></span><br></pre></td></tr></table></figure></p>
<p>到目前,博客已经算是搭建完成了,而且也已经发布到GitHub上,别人也可以访问得到了。在浏览器上访问<code>http:\\username.github.io</code>就能看到自己的博客了。</p>
<blockquote>
<p>tips:1.这边的username并非我的GitHub帐户名,我只是举个例子,你们将username改为你自己的GitHub帐户名即可<br>2.每次部署到GitHub上之后,可能要过一会儿才能显示最新的页面。即:输入完<code>hexo deploy</code>之后。建议一开始调试页面的时候在本地服务器上操作,可节省时间。 </p>
</blockquote>
<p><br></p>
<blockquote>
<p>提示:每次部署前最好先clean<br>步骤如下 </p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> hexo clean</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> hexo generate</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> hexo deploy</span></span><br></pre></td></tr></table></figure>
<h2 id="两个配置文件及主题更改"><a href="#两个配置文件及主题更改" class="headerlink" title="两个配置文件及主题更改"></a><font color="#0099ff">两个配置文件及主题更改</font></h2><p>在本地博客目录下有两个配置文件,分别是</p>
<ul>
<li>E:\hexo_config.yml</li>
<li>E:\hexo\themes\landscape_config.yml </li>
</ul>
<p>第二个为博客主题的配置文件,若想换成自己喜欢的主题可以去网上找一些主题(这里推荐几个不错的<a href="https://www.zhihu.com/question/24422335" target="_blank" rel="noopener">主题</a>),把主题源码下载下来,然后将整个文件夹粘贴到<code>E:\hexo\themes</code>下,然后编辑第一个配置文件,找到<code>theme:</code>字段,将后面的landscape改为刚刚添加的主题文件夹名<br>第一个配置文件中第一部分,Site部分,需要修改为你个人的信息,其他没提到的暂时可以使用默认的,若想修改的更加个性化可以自己再研究,可以参考<a href="https://hexo.io/zh-cn/docs/index.html" target="_blank" rel="noopener">Hexo文档</a>,博主觉得这些已经够用了,找个喜欢的主题就差不多了,所以也没有深究。<br><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># Site <span class="comment">//这下面的几项配置都很简单,基本都能明白什么意思及用途</span></span></span><br><span class="line"><span class="symbol">title:</span> Chillax blog <span class="comment">//博客名</span></span><br><span class="line"><span class="symbol">subtitle:</span> Goals determine what you are going to be <span class="comment">//副标题</span></span><br><span class="line"><span class="symbol">description:</span> Goals determine what you are going to be <span class="comment">//用于搜索,没有直观表现</span></span><br><span class="line"><span class="symbol">author:</span> DouDo <span class="comment">//作者</span></span><br><span class="line"><span class="symbol">language:</span> zh-CN <span class="comment">//语言</span></span><br><span class="line"><span class="symbol">timezone:</span> <span class="comment">//时区,此处不填写,hexo会以你目前电脑的时区为默认值</span></span><br></pre></td></tr></table></figure></p>
<p>第二个配置文件是根据主题而来,找到你喜欢的主题时,仔细看一下相关文档进行相应的修改即可。</p>
<h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a><font color="#0099ff">最后</font></h2><p>原本打算也整理出评论添加和域名绑定的相关文档,评论区引用有好多,目前比较推荐使用的是:Disqus和gitment,评论添加也很简单,我这边只稍微说一点,先推荐一个<a href="https://www.jianshu.com/p/c4f65ebe23ad" target="_blank" rel="noopener">教程</a></p>
<blockquote>
<p>他里面具体到添加多说代码块儿,你们添加时注意看下你们所找的主题,有的主题里可能已经配置好了,只需要你修改下配置文件里参数值。</p>
</blockquote>
<p>至于域名,其实是可有可无的,自己有个域名可能会显得更加高大上些,这当中其实没多少要配置的,主要就是购买域名和域名解析,网上的域名绑定都大同小异,很容易搞定。</p>
<h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><p>其实,一开始想写个很详细的教程,后来又想,网上已经有很多教程了,总结来总结去也就这些。虽然本人也是第一次建博客,不过搭建时也没遇到啥大的坑,比较顺利。所以,觉得没啥好讲的。写它也是因为自己在博客初篇中提到以后会写个搭建教程,自己挖的坑哭着也要填完T.T<br>就当练一练mackdown文本编辑吧。<br>有错误欢迎指出!</p>
]]></content>
<categories>
<category> Note </category>
</categories>
<tags>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title><![CDATA[开幕]]></title>
<url>/2017/12/29/%E5%BC%80%E5%B9%95/</url>
<content type="html"><![CDATA[<p>在朋友<a href="https://github.com/buyongfeng521" target="_blank" rel="noopener">buyongfeng</a>(下文中的大哥)的推荐和帮助下,折腾了一天多终于算是搭建好了。以后或许可能会换Theme,又或者懒得动自己选择性的优化一下页面吧。</p>
<a id="more"></a>
<p>由于我是一枚java后端猿,所以我对页面没改动什么,也是惭愧。之后我会整理出一篇搭建此博客的流程,希望可以给以后想搭建个人博客的朋友一点小小的帮助。</p>
<blockquote>
<p>建博客的念头起源 </p>
</blockquote>
<p>我只是一个在csdn上有个个人账号的java后端小白,原本打算就在csdn上好好弄个博客。然而这段时间经常看别人博客,在众多IT前辈的博客里畅游,寻找我想要的答案,从没有想过自己也有个属于自己个人的博客。就在前天晚上下班之前,看到我大哥(我的朋友也是同事更是前辈)的github主页,他也是好久没有打理了,然后找到他的博客,看到一篇《<a href="http://blog.step520.com/2016/12/05/Hexo%E5%9C%A8GitHub%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2/" target="_blank" rel="noopener">Hexo在GitHub搭建博客</a>》这才让我也想搭建一个属于自己的博客。</p>
<blockquote>
<p>感想 </p>
</blockquote>
<p>当我第一次看到我在GitHub page上搭建出来的博客雏形的时候,心里有种说不出来的感觉,在我购买了域名之后,我的博客的地址是以www开头com结尾的心里又是另一番情绪。都说:一入编程深似海,从此妹子是路人。此时的心情仅次于你拥有一个女朋友的时候,所以你懂的。 </p>
<p>作为一个90后,用过空间,微博,微信,人人等等,每一款都可以有一块属于自己的小天地,可以记录自己生活中的点点滴滴。而这个不一样,他是一块完全属于我自己的天地,作为码农,我希望他一天天的壮大,他的壮大代表着我的壮大,我会用我接下来的人生来点缀他,让他变得博学多才,五彩斑斓。 </p>
<p>最重要的是,我是一个跨专业转行过来的,个人对IT行业也是非常的感兴趣,这让我以后可以在我那些老同学面前装X,哈哈。(开个玩笑)</p>
<p>^ _ ^</p>
<blockquote>
<p>感谢 </p>
</blockquote>
<p>最后<br>感谢我亦师亦友的大哥<br>感些模板提供者<a href="https://github.com/MOxFIVE" target="_blank" rel="noopener">MOxFIVE</a></p>
]]></content>
<categories>
<category> Essay </category>
</categories>
</entry>
</search>