summaryrefslogtreecommitdiffstats
path: root/Master/Reference Architectures and Patterns/hjp5/html/k100289.html
blob: 30e17ee1ad4e39353bab0fe2d0a5ae9d260da2eb (plain)
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
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100287.html;106,k100288.html;107,k100290.html;108,k100292.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100287.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100288.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100290.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100292.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">Kapitel 45 - Objektorientierte Persistenz
</table>
<hr>


<!-- Section -->
<a name="sectlevel2id045002"></a>
<h2>45.2 Datenbank-Tabellen und Javaobjekte </h2>
<hr>
<ul>
<li><a href="k100289.html#sectlevel2id045002">45.2 Datenbank-Tabellen und Javaobjekte</a>
<ul>
<li><a href="k100289.html#sectlevel3id045002001">45.2.1 Eine einfache Javaklasse f&uuml;r Tabellen</a>
<li><a href="k100289.html#sectlevel3id045002002">45.2.2 Verkn&uuml;pfen der Javaklasse mit der Datenbank</a>
<li><a href="k100289.html#sectlevel3id045002003">45.2.3 Konfiguration des Datenbank-Zugriffs</a>
<ul>
<li><a href="k100289.html#sectlevel4id045002003001">Aufbau der Konfigurationsdatei</a>
</ul>
</ul>
</ul>
<hr>


<!-- Section -->
<a name="sectlevel3id045002001"></a>
<h3>45.2.1 Eine einfache Javaklasse f&uuml;r Tabellen </h3>

<p>
Wenn wir uns an die Tabelle <font color="#000077"><tt>dir</tt></font>
aus <a href="k100265.html#kapiteljdbc">Kapitel 42</a> erinnern, k&ouml;nnten
wir auf die Idee kommen, dass diese auch durch eine Java Bean repr&auml;sentiert
werden kann, deren Instanzen die Datens&auml;tze repr&auml;sentieren.
Zur Erinnerung - und damit Sie nicht immer hin- und herbl&auml;ttern
m&uuml;ssen - sei hier noch einmal die Tabellenstruktur angef&uuml;hrt:
<a name="tableid045001"></a>
<p>
<table cols=3 border width=66%>

<tr>
<td valign=top align=left width=25%><b>Name </b></td>
<td valign=top align=left width=25%><b>Typ </b></td>
<td valign=top align=left width=50%><b>Bedeutung</b></td></tr>
<tr>
<td valign=top align=left>did </td>
<td valign=top align=left>INT </td>
<td valign=top align=left>Prim&auml;rschl&uuml;ssel</td></tr>
<tr>
<td valign=top align=left>dname </td>
<td valign=top align=left>CHAR(100) </td>
<td valign=top align=left>Verzeichnisname</td></tr>
<tr>
<td valign=top align=left>fatherdid </td>
<td valign=top align=left>INT </td>
<td valign=top align=left>Schl&uuml;ssel Vaterverzeichnis</td></tr>
<tr>
<td valign=top align=left>entries </td>
<td valign=top align=left>INT </td>
<td valign=top align=left>Anzahl der Verzeichniseintr&auml;ge</td></tr>
</table>
<p><i>
Tabelle 45.1: Die Struktur der dir-Tabelle</i></p>

<p>
Der Einfachheit halber wollen wir uns hier auf die Tabelle <i>dir</i>
der Datenbank konzentrieren, obwohl die Java Bean f&uuml;r die Klasse
<i>file</i> ganz analog w&auml;re. Hierf&uuml;r entwerfen wir zun&auml;chst
eine einfache Javaklasse mit Variablen, die den Attributen der Datenbank-Tabelle
entsprechen. Jede Instanz der Klasse kann damit eine Zeile bzw. einen
Datensatz der Tabelle repr&auml;sentieren. 
<a name="dirtable1"></a>

<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#00AA00">/**
<font color="#555555">002 </font> * Diese Klasse repr&auml;sentiert die Tabelle 'dir' der 'DirDB'
<font color="#555555">003 </font> * Jede Instanz der Klasse repr&auml;sentiert wiederum einen
<font color="#555555">004 </font> * Datensatz
<font color="#555555">005 </font> */</font>
<font color="#555555">006 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Directory {
<font color="#555555">007 </font>
<font color="#555555">008 </font>  <font color="#00AA00">// Variablen die den Attributen der Tabelle entsprechen</font>
<font color="#555555">009 </font>  <font color="#0000AA">private</font> <font color="#006699">int</font> did;
<font color="#555555">010 </font>  <font color="#0000AA">private</font> String dname;
<font color="#555555">011 </font>  <font color="#0000AA">private</font> <font color="#006699">int</font> fatherid;
<font color="#555555">012 </font>  <font color="#0000AA">private</font> <font color="#006699">int</font> entries;
<font color="#555555">013 </font>
<font color="#555555">014 </font>  <font color="#00AA00">/**
<font color="#555555">015 </font>   * Ein einfacher Konstruktor ohne Initialisierung der
<font color="#555555">016 </font>   * Objektvariablen
<font color="#555555">017 </font>   */</font>
<font color="#555555">018 </font>  <font color="#0000AA">public</font> Directory() {
<font color="#555555">019 </font>  }
<font color="#555555">020 </font>
<font color="#555555">021 </font>  <font color="#00AA00">/**
<font color="#555555">022 </font>   * Konstruktor zum Erzeugen von Instanzen der Klasse
<font color="#555555">023 </font>   */</font>
<font color="#555555">024 </font>  <font color="#0000AA">public</font> Directory(<font color="#006699">int</font> did,
<font color="#555555">025 </font>                   String dname,
<font color="#555555">026 </font>                   <font color="#006699">int</font> fatherid,
<font color="#555555">027 </font>                   <font color="#006699">int</font> entries)
<font color="#555555">028 </font>  {
<font color="#555555">029 </font>      <font color="#006699">this</font>.did = did;
<font color="#555555">030 </font>      <font color="#006699">this</font>.dname = dname;
<font color="#555555">031 </font>      <font color="#006699">this</font>.fatherid = fatherid;
<font color="#555555">032 </font>      <font color="#006699">this</font>.entries = entries;
<font color="#555555">033 </font>  }
<font color="#555555">034 </font>
<font color="#555555">035 </font>  <font color="#00AA00">// Zugriffsmethoden, um die Daten</font>
<font color="#555555">036 </font>  <font color="#00AA00">// Lesen und Schreiben zu k&ouml;nnen  </font>
<font color="#555555">037 </font>  <font color="#0000AA">public</font> <font color="#006699">int</font> getDid()
<font color="#555555">038 </font>  {
<font color="#555555">039 </font>    <font color="#0000AA">return</font> did;
<font color="#555555">040 </font>  }
<font color="#555555">041 </font>
<font color="#555555">042 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> setDid(<font color="#006699">int</font> did)
<font color="#555555">043 </font>  {
<font color="#555555">044 </font>    <font color="#006699">this</font>.did = did;
<font color="#555555">045 </font>  }
<font color="#555555">046 </font>
<font color="#555555">047 </font>  <font color="#0000AA">public</font> String getDname()
<font color="#555555">048 </font>  {
<font color="#555555">049 </font>    <font color="#0000AA">return</font> dname;
<font color="#555555">050 </font>  }
<font color="#555555">051 </font>
<font color="#555555">052 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> setDname(String dname)
<font color="#555555">053 </font>  {
<font color="#555555">054 </font>    <font color="#006699">this</font>.dname = dname;
<font color="#555555">055 </font>  }
<font color="#555555">056 </font>
<font color="#555555">057 </font>  <font color="#0000AA">public</font> <font color="#006699">int</font> getFatherid()
<font color="#555555">058 </font>  {
<font color="#555555">059 </font>    <font color="#0000AA">return</font> fatherid;
<font color="#555555">060 </font>  }
<font color="#555555">061 </font>
<font color="#555555">062 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> setFatherid(<font color="#006699">int</font> fatherid)
<font color="#555555">063 </font>  {
<font color="#555555">064 </font>    <font color="#006699">this</font>.fatherid = fatherid;
<font color="#555555">065 </font>  }
<font color="#555555">066 </font>
<font color="#555555">067 </font>  <font color="#0000AA">public</font> <font color="#006699">int</font> getEntries()
<font color="#555555">068 </font>  {
<font color="#555555">069 </font>    <font color="#0000AA">return</font> entries;
<font color="#555555">070 </font>  }
<font color="#555555">071 </font>
<font color="#555555">072 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> setEntries(<font color="#006699">int</font> entries)
<font color="#555555">073 </font>  {
<font color="#555555">074 </font>    <font color="#006699">this</font>.entries = entries;
<font color="#555555">075 </font>  }
<font color="#555555">076 </font>
<font color="#555555">077 </font>  <font color="#0000AA">public</font> String toString() 
<font color="#555555">078 </font>  {
<font color="#555555">079 </font>    <font color="#0000AA">return</font> <font color="#0000FF">"Directory[id:"</font>+ did + <font color="#0000FF">", name:"</font> + dname +  <font color="#0000FF">"]"</font>;
<font color="#555555">080 </font>  }    
<font color="#555555">081 </font>}</pre>
</font>
</td>
</tr>
</table>
<i>
Listing 45.1: Eine Klasse f&uuml;r die dir-Tabelle</i></p>

<p>
Wie wir sehen enth&auml;lt die Klasse <font color="#000077"><tt>Directory</tt></font>
f&uuml;r jedes Datenbank-Attribut eine &auml;quivalente Variable,
die &uuml;ber Getter-Methoden ausgelesen und &uuml;ber Setter-Methoden
ver&auml;ndert werden kann. Derartige Javaobjekte werden auch als
Java Beans bezeichnet, die wir in <a href="k100280.html#sectionbeans">Abschnitt 44.1</a>
kennen gelernt haben.

<!-- Section -->

<a name="sectlevel3id045002002"></a>
<h3>45.2.2 Verkn&uuml;pfen der Javaklasse mit der Datenbank </h3>

<p>
Die soeben erstellte Javaklasse ist sehr einfach und entspricht auf
triviale Weise der Datenbank-Tabelle, jedoch m&uuml;ssen wir diese
Verkn&uuml;pfung Java auch direkt und unmissverst&auml;ndlich anzeigen.
Hierzu bedienen wir uns zus&auml;tzlicher Metainformationen in Form
so genannter <a name="ixa103336">Annotation</a>en, die in <a href="k100277.html#sectionannotationen">Abschnitt 43.6</a>
beschrieben wurden. 

<p>
Diese Metainformationen beeinflussen die Klasse oder den Programmablauf
in keiner Weise, k&ouml;nnen jedoch zur Laufzeit - zum Beispiel &uuml;ber
die Reflection API - ausgelesen werden. Die in den Annotationen hinterlegten
Informationen teilen der Persistenzschicht dabei mit, welche Tabelle
der Datenbank und welche Spalten auf die jeweiligen Attribute abgebildet
werden. Das folgende Listing zeigt die hierf&uuml;r notwendigen Erweiterungen:
<a name="directory"></a>

<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA">import</font> javax.persistence.*;
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#00AA00">/**
<font color="#555555">004 </font> * Diese Klasse repr&auml;sentiert die Tabelle 'dir' der 'DirDB'
<font color="#555555">005 </font> * Jede Instanz der Klasse repr&auml;sentiert wiederum einen
<font color="#555555">006 </font> * Datensatz
<font color="#555555">007 </font> */</font>
<font color="#555555">008 </font>@Entity
<font color="#555555">009 </font>@Table( name = <font color="#0000FF">"dir"</font> )
<font color="#555555">010 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Directory {
<font color="#555555">011 </font>
<font color="#555555">012 </font>  <font color="#00AA00">// Variablen die den Attributen der Tabelle entsprechen</font>
<font color="#555555">013 </font>  <font color="#0000AA">private</font> <font color="#006699">int</font> did;
<font color="#555555">014 </font>  <font color="#0000AA">private</font> String dname;
<font color="#555555">015 </font>  <font color="#0000AA">private</font> <font color="#006699">int</font> fatherid;
<font color="#555555">016 </font>  <font color="#0000AA">private</font> <font color="#006699">int</font> entries;
<font color="#555555">017 </font>
<font color="#555555">018 </font>  <font color="#00AA00">/**
<font color="#555555">019 </font>   * Ein einfacher Konstruktor ohne Initialisierung der
<font color="#555555">020 </font>   * Objektvariablen
<font color="#555555">021 </font>   */</font>
<font color="#555555">022 </font>  <font color="#0000AA">public</font> Directory() {
<font color="#555555">023 </font>  }
<font color="#555555">024 </font>
<font color="#555555">025 </font>  <font color="#00AA00">/**
<font color="#555555">026 </font>   * Konstruktor mit Initialisierung der Variablen
<font color="#555555">027 </font>   */</font>
<font color="#555555">028 </font>  <font color="#0000AA">public</font> Directory(<font color="#006699">int</font> did,
<font color="#555555">029 </font>                   String dname,
<font color="#555555">030 </font>                   <font color="#006699">int</font> fatherid,
<font color="#555555">031 </font>                   <font color="#006699">int</font> entries)
<font color="#555555">032 </font>  {
<font color="#555555">033 </font>    <font color="#006699">this</font>.did = did;
<font color="#555555">034 </font>    <font color="#006699">this</font>.dname = dname;
<font color="#555555">035 </font>    <font color="#006699">this</font>.fatherid = fatherid;
<font color="#555555">036 </font>    <font color="#006699">this</font>.entries = entries;
<font color="#555555">037 </font>  }
<font color="#555555">038 </font>
<font color="#555555">039 </font>  <font color="#00AA00">// Zugriffsmethoden, um die Daten der Klasse</font>
<font color="#555555">040 </font>  <font color="#00AA00">// Auslesen und Schreiben zu k&ouml;nnen</font>
<font color="#555555">041 </font>  @Id
<font color="#555555">042 </font>  @Column( name = <font color="#0000FF">"id"</font> )
<font color="#555555">043 </font>  <font color="#0000AA">public</font> <font color="#006699">int</font> getDid()
<font color="#555555">044 </font>  {
<font color="#555555">045 </font>    <font color="#0000AA">return</font> did;
<font color="#555555">046 </font>  }
<font color="#555555">047 </font>
<font color="#555555">048 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> setDid(<font color="#006699">int</font> did)
<font color="#555555">049 </font>  {
<font color="#555555">050 </font>    <font color="#006699">this</font>.did = did;
<font color="#555555">051 </font>  }
<font color="#555555">052 </font>
<font color="#555555">053 </font>  @Column( name = <font color="#0000FF">"dname"</font>, nullable = <font color="#006699">false</font> ) <a name="directory.x"></a>
<font color="#555555">054 </font>  <font color="#0000AA">public</font> String getDname()
<font color="#555555">055 </font>  {
<font color="#555555">056 </font>    <font color="#0000AA">return</font> dname;
<font color="#555555">057 </font>  }
<font color="#555555">058 </font>
<font color="#555555">059 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> setDname(String dname)
<font color="#555555">060 </font>  {
<font color="#555555">061 </font>    <font color="#006699">this</font>.dname = dname;
<font color="#555555">062 </font>  }
<font color="#555555">063 </font>
<font color="#555555">064 </font>  @Column ( name = <font color="#0000FF">"fatherid"</font> )
<font color="#555555">065 </font>  <font color="#0000AA">public</font> <font color="#006699">int</font> getFatherid()
<font color="#555555">066 </font>  {
<font color="#555555">067 </font>    <font color="#0000AA">return</font> fatherid;
<font color="#555555">068 </font>  }
<font color="#555555">069 </font>
<font color="#555555">070 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> setFatherid(<font color="#006699">int</font> fatherid)
<font color="#555555">071 </font>  {
<font color="#555555">072 </font>    <font color="#006699">this</font>.fatherid = fatherid;
<font color="#555555">073 </font>  }
<font color="#555555">074 </font>
<font color="#555555">075 </font>  @Column ( name = <font color="#0000FF">"entries"</font> )
<font color="#555555">076 </font>  <font color="#0000AA">public</font> <font color="#006699">int</font> getEntries()
<font color="#555555">077 </font>  {
<font color="#555555">078 </font>    <font color="#0000AA">return</font> entries;
<font color="#555555">079 </font>  }
<font color="#555555">080 </font>
<font color="#555555">081 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> setEntries(<font color="#006699">int</font> entries)
<font color="#555555">082 </font>  {
<font color="#555555">083 </font>    <font color="#006699">this</font>.entries = entries;
<font color="#555555">084 </font>  }
<font color="#555555">085 </font>    
<font color="#555555">086 </font>  <font color="#0000AA">public</font> String toString() 
<font color="#555555">087 </font>  {
<font color="#555555">088 </font>    <font color="#0000AA">return</font> <font color="#0000FF">"Directory[id:"</font>+ did + <font color="#0000FF">", name:"</font> + dname +  <font color="#0000FF">"]"</font>;
<font color="#555555">089 </font>  }    
<font color="#555555">090 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/Directory.java"><font color="#000055" size=-1>Directory.java</font></a></td>
</tr>
</table>
<i>
Listing 45.2: Annotierte Klasse f&uuml;r die dir-Tabelle</i></p>

<p>
Wenn wir dieses Listing mit dem vorangegangenen vergleichen, sehen
wir, dass lediglich einige Annotationen hinzugekommen sind. Sie enthalten
Informationen, die Java ben&ouml;tigt, um die Instanzen der Klasse
mit der Tabelle in der Datenbank zu verkn&uuml;pfen. Die Annotationen
f&uuml;r das Java Persistenz API k&ouml;nnen entweder &uuml;ber den
Variablen der Klasse selbst oder &uuml;ber die damit verkn&uuml;pften
Getter-Methoden stehen. Die Reihenfolge der Methoden spielt keine
Rolle. 

<p>
Die <a name="ixa103336">Annotation</a>en haben folgende Bedeutung:
<a name="tableid045002"></a>
<p>
<table cols=2 border width=66%>

<tr>
<td valign=top align=left width=33%><b>Annotation </b></td>
<td valign=top align=left width=66%><b>Beschreibung</b></td></tr>
<tr>
<td valign=top align=left><a href="index_0.html#ixb102474"><font color=#000080><tt>@Entity</tt></font></a>
</td>
<td valign=top align=left>Markiert die Klasse als persistierbares,
dass hei&szlig;t mit einer Datenbank verkn&uuml;pftes Objekt</td></tr>
<tr>
<td valign=top align=left><a href="index_0.html#ixb102475"><font color=#000080><tt>@Table</tt></font></a>
</td>
<td valign=top align=left>Bezeichnet die verkn&uuml;pfte Datenbanktabelle</td></tr>
<tr>
<td valign=top align=left><a href="index_0.html#ixb102476"><font color=#000080><tt>@Id</tt></font></a>
</td>
<td valign=top align=left>Markiert das Attribut als Prim&auml;rschl&uuml;ssel
der Datenbank. Das ist z.B. f&uuml;r Suchoperationen wichtig</td></tr>
<tr>
<td valign=top align=left><a href="index_0.html#ixb102477"><font color=#000080><tt>@Column</tt></font></a>
</td>
<td valign=top align=left>Verkn&uuml;pft das Attribut mit einer Datenbankspalte</td></tr>
</table>
<p><i>
Tabelle 45.2: Die Struktur der dir-Tabelle</i></p>

<p>
Die Annotationen <a href="index_t.html#ixb102478"><font color=#000080><tt>Table</tt></font></a>
und <a href="index_c.html#ixb102479"><font color=#000080><tt>Column</tt></font></a>
besitzen jeweils das Attribut <font color="#000077"><tt>name</tt></font>,
das den Namen der verkn&uuml;pften Tabelle bzw. Spalte enth&auml;lt.
Ist dieser Name identisch mit dem Namen des Javaattributes kann die
Angabe auch weggelassen werden. Allerdings empfehlen wir Ihnen - schon
allein um die Dokumentation zu erh&ouml;hen - diese Angabe mit aufzunehmen.
<a href="k100289.html#directory.x">Zeile 053</a> zeigt zudem, dass
die Annotationen weitere Attribute aufnehmen k&ouml;nnen, mit denen
die Struktur und Beschr&auml;nkungen der Datenbank granular konfiguriert
werden k&ouml;nnen. 

<p>
Die Annotation <font color="#000077"><tt>@Column</tt></font> unterst&uuml;tzt
folgende Attribute <a name="tableid045003"></a>

<p>
<table cols=4 border width=66%>

<tr>
<td valign=top align=left width=16%><b>Attribut </b></td>
<td valign=top align=left width=16%><b>Typ </b></td>
<td valign=top align=left width=33%><b>Beschreibung </b></td>
<td valign=top align=left width=33%><b>Standardwert</b></td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>name</tt></font>
</td>
<td valign=top align=left><font color="#000077"><tt>String</tt></font>
</td>
<td valign=top align=left>Name der Tabellenspalte </td>
<td valign=top align=left>Name des Java Bean Attributs</td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>length</tt></font>
</td>
<td valign=top align=left><font color="#000077"><tt>int</tt></font>
</td>
<td valign=top align=left>Maximale L&auml;nge des Eintrags </td>
<td valign=top align=left>255</td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>table</tt></font>
</td>
<td valign=top align=left><font color="#000077"><tt>String</tt></font>
</td>
<td valign=top align=left>Name einer Tabelle </td>
<td valign=top align=left>Namen der Tabelle dieser Java Bean</td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>nullable</tt></font>
</td>
<td valign=top align=left><font color="#000077"><tt>boolean</tt></font>
</td>
<td valign=top align=left>Sind <font color="#000077"><tt>null</tt></font>-Werte
erlaubt? </td>
<td valign=top align=left><font color="#000077"><tt>true</tt></font></td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>insertable</tt></font>
</td>
<td valign=top align=left><font color="#000077"><tt>boolean</tt></font>
</td>
<td valign=top align=left>Darf dieser Wert mit INSERT Statements ver&auml;ndert
werden? </td>
<td valign=top align=left><font color="#000077"><tt>true</tt></font></td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>updateable</tt></font>
</td>
<td valign=top align=left><font color="#000077"><tt>boolean</tt></font>
</td>
<td valign=top align=left>Darf dieser Wert mit UPDATE Statements ge&auml;ndert
werden? </td>
<td valign=top align=left><font color="#000077"><tt>true</tt></font></td></tr>
</table>
<p><i>
Tabelle 45.3: Attribute der Annotation @Column</i></p>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Egal welche Konstruktoren wir f&uuml;r die mit der Datenbank verkn&uuml;pfte
Java Bean vorsehen, das Persistenz Framework ben&ouml;tigt zus&auml;tzlich
einen &#187;leeren&#171; Standardkonstruktor. Bei Bedarf k&ouml;nnen
Sie dessen Sichtbarkeit auch auf <font color="#000077"><tt>protected</tt></font>
setzen und damit f&uuml;r andere Klassen weitestgehend einschr&auml;nken.
Er muss jedoch vorhanden sein, da das Framework sonst nicht mit der
Java Bean arbeiten kann!</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF">&nbsp;Warnung&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>


<!-- Section -->
<a name="sectlevel3id045002003"></a>
<h3>45.2.3 Konfiguration des Datenbank-Zugriffs </h3>

<p>
Jetzt haben wir eine Java Bean erstellt, die in der Lage, ist einen
Datensatz der Tabelle <font color="#000077"><tt>dir</tt></font> aufzunehmen
und diese zudem mit Zusatzinformationen ausgestattet, um die Verkn&uuml;pfung
zwischen Datenbank auf Javaklasse beschreiben. Was noch fehlt sind
Informationen dar&uuml;ber, in welcher Datenbank sich die entsprechenden
Tabellen befinden. 

<p>
Nat&uuml;rlich k&ouml;nnten diese Informationen theoretisch ebenfalls
in der Javaklasse abgelegt werden, dies w&uuml;rde jedoch zu unflexiblem
Code f&uuml;hren, der nicht mit verschiedenen Datenbanken zusammenarbeiten
k&ouml;nnte. Um die tats&auml;chliche Datenbank auch im Nachhinein
flexibel austauschen und beispielsweise statt der Hypersonic DB eine
Access Datenbank verwenden zu k&ouml;nnen, werden diese Konfigurationsdaten
in einer separaten Datei gepflegt. Diese wird auch als <a name="ixa103337"><i>Persistence
Descriptor</i></a> bezeichnet und k&ouml;nnte
beispielsweise folgende Form haben: 
<a name="persistence"></a>

<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font>&lt;?xml version=<font color="#0000FF">"1.0"</font> encoding=<font color="#0000FF">"ISO-8859-1"</font>?&gt;
<font color="#555555">002 </font>
<font color="#555555">003 </font>&lt;!-- Persistenz Descriptor zur Konfiguration --&gt;
<font color="#555555">004 </font>&lt;persistence&gt;
<font color="#555555">005 </font>
<font color="#555555">006 </font>  &lt;!-- Hinterlegen eines symbolischen Namens --&gt;
<font color="#555555">007 </font>  &lt;persistence-unit name=<font color="#0000FF">"persistenceExample"</font> <a name="persistence.z"></a>
<font color="#555555">008 </font>                    transaction-type=<font color="#0000FF">"RESOURCE_LOCAL"</font>&gt;
<font color="#555555">009 </font>
<font color="#555555">010 </font>    &lt;!-- Zu verwendende Implementierung --&gt;
<font color="#555555">011 </font>    &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;
<font color="#555555">012 </font>
<font color="#555555">013 </font>    &lt;!-- Persistierbare Klassen --&gt;
<font color="#555555">014 </font>    &lt;<font color="#0000AA">class</font>&gt;Directory&lt;/class&gt; <a name="persistence.a"></a>
<font color="#555555">015 </font>
<font color="#555555">016 </font>    &lt;!-- Konfiguration der Hibernate Implementierung --&gt;
<font color="#555555">017 </font>    &lt;properties&gt;
<font color="#555555">018 </font>      &lt;!-- Name des intern verwendeten JDBC-Treibers --&gt;
<font color="#555555">019 </font>      &lt;property name=<font color="#0000FF">"hibernate.connection.driver_class"</font>
<font color="#555555">020 </font>                value=<font color="#0000FF">"org.hsqldb.jdbcDriver"</font>/&gt; <a name="persistence.b"></a>
<font color="#555555">021 </font>
<font color="#555555">022 </font>      &lt;!-- URL der zu verwendenden Datenbank --&gt;
<font color="#555555">023 </font>      &lt;property name=<font color="#0000FF">"hibernate.connection.url"</font>
<font color="#555555">024 </font>                value=<font color="#0000FF">"jdbc:hsqldb:hsqldbtest"</font>/&gt; <a name="persistence.c"></a>
<font color="#555555">025 </font>
<font color="#555555">026 </font>      &lt;!-- SQL-Dialect, den Hibernate verwenden soll --&gt;
<font color="#555555">027 </font>      &lt;property name=<font color="#0000FF">"hibernate.dialect"</font>
<font color="#555555">028 </font>                value=<font color="#0000FF">"org.hibernate.dialect.HSQLDialect"</font>/&gt;
<font color="#555555">029 </font>
<font color="#555555">030 </font>      &lt;!-- Benutzername und Passwort; Standardwerte der HSQLDB --&gt;
<font color="#555555">031 </font>      &lt;property name=<font color="#0000FF">"hibernate.connection.username"</font> value=<font color="#0000FF">"SA"</font>/&gt; <a name="persistence.d"></a>
<font color="#555555">032 </font>      &lt;property name=<font color="#0000FF">"hibernate.connection.password"</font> value=<font color="#0000FF">""</font>/&gt; <a name="persistence.e"></a>
<font color="#555555">033 </font>
<font color="#555555">034 </font>      &lt;!-- Flag, ob Tabellen automatisch erzeugt werden sollen --&gt;
<font color="#555555">035 </font>      &lt;property name=<font color="#0000FF">"hibernate.hbm2ddl.auto"</font> value=<font color="#0000FF">"create"</font>/&gt; <a name="persistence.f"></a>
<font color="#555555">036 </font>
<font color="#555555">037 </font>      &lt;!-- Flag, ob SQL-Statements ausgegeben werden sollen --&gt;
<font color="#555555">038 </font>      &lt;property name=<font color="#0000FF">"hibernate.show_sql"</font> value=<font color="#0000FF">"true"</font>/&gt; <a name="persistence.g"></a>
<font color="#555555">039 </font>    &lt;/properties&gt;
<font color="#555555">040 </font>  &lt;/persistence-unit&gt;
<font color="#555555">041 </font>&lt;/persistence&gt;</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/persistence.xml"><font color="#000055" size=-1>persistence.xml</font></a></td>
</tr>
</table>
<i>
Listing 45.3: Konfigurationsdatei f&uuml;r das Java Persistenz API</i></p>

<p>
Diese Datei muss unter dem Namen <font color="#000077"><tt>persistence.xml</tt></font>
im Classpath abgelegt werden, und schon kann das Persistenz API die
Klasse <font color="#000077"><tt>Directory</tt></font> mit der Tabelle
<font color="#000077"><tt>dir</tt></font> in der HSQLDB verkn&uuml;pfen.
Am einfachsten ist dies zu bewerkstelligen, indem die Datei <font color="#000077"><tt>persistence.xml</tt></font>
gemeinsam mit der kompilierten Class-Datei <font color="#000077"><tt>Directory.class</tt></font>
gespeichert wird. 

<!-- Section -->

<a name="sectlevel4id045002003001"></a>
<h4>Aufbau der Konfigurationsdatei </h4>

<p>
Die Konfigurationsdatei ist in einzelne Seqmente aufgeteilt, die verschiedene
Aufgaben besitzen. <a href="k100289.html#persistence">Listing 45.3</a>
ist so vorkonfiguriert, dass es mit der HSQLDB aus Kapitel <a href="k100265.html#kapiteljdbc">Kapitel 42</a>
verwenden werden kann. Um auf die Tabellen einer anderen Datenbank
zuzugreifen m&uuml;ssen der Datenbanktreiber, die URL und die Zugangsdaten
angepasst werden. Wenn wir dieses Listing mit <a href="k100268.html#jdbcconfig">Listing 42.3</a>
vergleichen, sollten uns viele Optionen vertraut vorkommen. Diese
sind nun nicht mehr fest in die Javaklasse einkompiliert, sondern
k&ouml;nnen in einer separaten Datei gewartet werden. <a name="tableid045004"></a>

<p>
<table cols=2 border width=66%>

<tr>
<td valign=top align=left width=25%><b>Zeile </b></td>
<td valign=top align=left width=75%><b>Beschreibung der Konfigurationseinstellung</b></td></tr>
<tr>
<td valign=top align=left><a href="k100289.html#persistence.z">Zeile 007</a>
</td>
<td valign=top align=left>Ein symbolischer Name f&uuml;r die Konfiguration,
den wir sp&auml;ter f&uuml;r den Zugriff verwenden werden</td></tr>
<tr>
<td valign=top align=left><a href="k100289.html#persistence.a">Zeile 014</a>
</td>
<td valign=top align=left>Liste der Klassen, die mit der Datenbank
verkn&uuml;pft werden sollen</td></tr>
<tr>
<td valign=top align=left><a href="k100289.html#persistence.b">Zeile 020</a>
</td>
<td valign=top align=left>Name des passenden JDBC-Treibers</td></tr>
<tr>
<td valign=top align=left><a href="k100289.html#persistence.c">Zeile 024</a>
</td>
<td valign=top align=left>Name der Datenbank</td></tr>
<tr>
<td valign=top align=left><a href="k100289.html#persistence.d">Zeile 031</a>
</td>
<td valign=top align=left>Benutzername f&uuml;r den Zugriff auf die
Datenbank</td></tr>
<tr>
<td valign=top align=left><a href="k100289.html#persistence.e">Zeile 032</a>
</td>
<td valign=top align=left>Passwort f&uuml;r den Zugriff auf die Datenbank</td></tr>
<tr>
<td valign=top align=left><a href="k100289.html#persistence.f">Zeile 035</a>
</td>
<td valign=top align=left>Gibt an, ob die Tabellen bei Bedarf dynamisch
erstellt werden sollen</td></tr>
<tr>
<td valign=top align=left><a href="k100289.html#persistence.g">Zeile 038</a>
</td>
<td valign=top align=left>Gibt an, ob die intern verwendeten SQL-Statements
auf der Kommandozeile ausgegeben werden sollen</td></tr>
</table>
<p><i>
Tabelle 45.4: Anpassen der Konfigurationsdatei</i></p>

<p>
Nachdem wir die Datei <font color="#660099">persistence.xml</font>
zusammen mit der <font color="#000077"><tt>Directory</tt></font>-Class
abgelegt haben k&ouml;nnen wir nun mit dem Java Persistenz API arbeiten
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Die vorangegangenen Schritte erscheinen Ihnen vielleicht aufw&auml;ndiger
als die vermeintlichen Pendants im Kapitel &uuml;ber JDBC. Der Vorteil
des Java Persistenz API liegt jedoch vor allem in der wesentlich einfacheren
Anwendung, mit der wir uns im folgenden Abschnitt besch&auml;ftigen
werden. 

<p>
Die gute Nachricht ist: Nachdem wir die Verkn&uuml;pfung zwischen
Javaklasse und Datenbank nun konfiguriert haben, k&ouml;nnen wir nachfolgend
einfach mit der <font color="#000077"><tt>Directory</tt></font>-Klasse
arbeiten, ohne uns weiter um SQL oder Datenbank-Aspekte k&uuml;mmern
zu m&uuml;ssen.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF">&nbsp;Hinweis&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100287.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100288.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100290.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100292.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">&copy; 1998, 2007 Guido Kr&uuml;ger &amp; Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>