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"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100287.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100288.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100290.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100292.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </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ür Tabellen</a>
<li><a href="k100289.html#sectlevel3id045002002">45.2.2 Verknü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ü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önnten
wir auf die Idee kommen, dass diese auch durch eine Java Bean repräsentiert
werden kann, deren Instanzen die Datensätze repräsentieren.
Zur Erinnerung - und damit Sie nicht immer hin- und herblättern
müssen - sei hier noch einmal die Tabellenstruktur angefü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ärschlü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ü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ä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ür die Klasse
<i>file</i> ganz analog wäre. Hierfür entwerfen wir zunä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ä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äsentiert die Tabelle 'dir' der 'DirDB'
<font color="#555555">003 </font> * Jede Instanz der Klasse reprä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ö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ür die dir-Tabelle</i></p>
<p>
Wie wir sehen enthält die Klasse <font color="#000077"><tt>Directory</tt></font>
für jedes Datenbank-Attribut eine äquivalente Variable,
die über Getter-Methoden ausgelesen und über Setter-Methoden
verä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ü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üssen wir diese
Verknüpfung Java auch direkt und unmissverständlich anzeigen.
Hierzu bedienen wir uns zusä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önnen jedoch zur Laufzeit - zum Beispiel ü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ü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äsentiert die Tabelle 'dir' der 'DirDB'
<font color="#555555">005 </font> * Jede Instanz der Klasse reprä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ö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ü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ötigt, um die Instanzen der Klasse
mit der Tabelle in der Datenbank zu verknüpfen. Die Annotationen
für das Java Persistenz API können entweder über den
Variablen der Klasse selbst oder über die damit verknü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ßt mit einer Datenbank verknü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ü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ärschlüssel
der Datenbank. Das ist z.B. fü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ü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üpften Tabelle bzw. Spalte enthä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öhen - diese Angabe mit aufzunehmen.
<a href="k100289.html#directory.x">Zeile 053</a> zeigt zudem, dass
die Annotationen weitere Attribute aufnehmen können, mit denen
die Struktur und Beschränkungen der Datenbank granular konfiguriert
werden können.
<p>
Die Annotation <font color="#000077"><tt>@Column</tt></font> unterstü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ä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ä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ä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ür die mit der Datenbank verknüpfte
Java Bean vorsehen, das Persistenz Framework benötigt zusätzlich
einen »leeren« Standardkonstruktor. Bei Bedarf können
Sie dessen Sichtbarkeit auch auf <font color="#000077"><tt>protected</tt></font>
setzen und damit für andere Klassen weitestgehend einschrä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"> Warnung </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üpfung
zwischen Datenbank auf Javaklasse beschreiben. Was noch fehlt sind
Informationen darüber, in welcher Datenbank sich die entsprechenden
Tabellen befinden.
<p>
Natürlich könnten diese Informationen theoretisch ebenfalls
in der Javaklasse abgelegt werden, dies würde jedoch zu unflexiblem
Code führen, der nicht mit verschiedenen Datenbanken zusammenarbeiten
könnte. Um die tatsächliche Datenbank auch im Nachhinein
flexibel austauschen und beispielsweise statt der Hypersonic DB eine
Access Datenbank verwenden zu können, werden diese Konfigurationsdaten
in einer separaten Datei gepflegt. Diese wird auch als <a name="ixa103337"><i>Persistence
Descriptor</i></a> bezeichnet und kö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><?xml version=<font color="#0000FF">"1.0"</font> encoding=<font color="#0000FF">"ISO-8859-1"</font>?>
<font color="#555555">002 </font>
<font color="#555555">003 </font><!-- Persistenz Descriptor zur Konfiguration -->
<font color="#555555">004 </font><persistence>
<font color="#555555">005 </font>
<font color="#555555">006 </font> <!-- Hinterlegen eines symbolischen Namens -->
<font color="#555555">007 </font> <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>>
<font color="#555555">009 </font>
<font color="#555555">010 </font> <!-- Zu verwendende Implementierung -->
<font color="#555555">011 </font> <provider>org.hibernate.ejb.HibernatePersistence</provider>
<font color="#555555">012 </font>
<font color="#555555">013 </font> <!-- Persistierbare Klassen -->
<font color="#555555">014 </font> <<font color="#0000AA">class</font>>Directory</class> <a name="persistence.a"></a>
<font color="#555555">015 </font>
<font color="#555555">016 </font> <!-- Konfiguration der Hibernate Implementierung -->
<font color="#555555">017 </font> <properties>
<font color="#555555">018 </font> <!-- Name des intern verwendeten JDBC-Treibers -->
<font color="#555555">019 </font> <property name=<font color="#0000FF">"hibernate.connection.driver_class"</font>
<font color="#555555">020 </font> value=<font color="#0000FF">"org.hsqldb.jdbcDriver"</font>/> <a name="persistence.b"></a>
<font color="#555555">021 </font>
<font color="#555555">022 </font> <!-- URL der zu verwendenden Datenbank -->
<font color="#555555">023 </font> <property name=<font color="#0000FF">"hibernate.connection.url"</font>
<font color="#555555">024 </font> value=<font color="#0000FF">"jdbc:hsqldb:hsqldbtest"</font>/> <a name="persistence.c"></a>
<font color="#555555">025 </font>
<font color="#555555">026 </font> <!-- SQL-Dialect, den Hibernate verwenden soll -->
<font color="#555555">027 </font> <property name=<font color="#0000FF">"hibernate.dialect"</font>
<font color="#555555">028 </font> value=<font color="#0000FF">"org.hibernate.dialect.HSQLDialect"</font>/>
<font color="#555555">029 </font>
<font color="#555555">030 </font> <!-- Benutzername und Passwort; Standardwerte der HSQLDB -->
<font color="#555555">031 </font> <property name=<font color="#0000FF">"hibernate.connection.username"</font> value=<font color="#0000FF">"SA"</font>/> <a name="persistence.d"></a>
<font color="#555555">032 </font> <property name=<font color="#0000FF">"hibernate.connection.password"</font> value=<font color="#0000FF">""</font>/> <a name="persistence.e"></a>
<font color="#555555">033 </font>
<font color="#555555">034 </font> <!-- Flag, ob Tabellen automatisch erzeugt werden sollen -->
<font color="#555555">035 </font> <property name=<font color="#0000FF">"hibernate.hbm2ddl.auto"</font> value=<font color="#0000FF">"create"</font>/> <a name="persistence.f"></a>
<font color="#555555">036 </font>
<font color="#555555">037 </font> <!-- Flag, ob SQL-Statements ausgegeben werden sollen -->
<font color="#555555">038 </font> <property name=<font color="#0000FF">"hibernate.show_sql"</font> value=<font color="#0000FF">"true"</font>/> <a name="persistence.g"></a>
<font color="#555555">039 </font> </properties>
<font color="#555555">040 </font> </persistence-unit>
<font color="#555555">041 </font></persistence></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ü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ü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ü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ö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ür die Konfiguration,
den wir später fü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ü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ü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ü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ö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ändiger
als die vermeintlichen Pendants im Kapitel ü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äftigen
werden.
<p>
Die gute Nachricht ist: Nachdem wir die Verknüpfung zwischen
Javaklasse und Datenbank nun konfiguriert haben, können wir nachfolgend
einfach mit der <font color="#000077"><tt>Directory</tt></font>-Klasse
arbeiten, ohne uns weiter um SQL oder Datenbank-Aspekte kümmern
zu mü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"> Hinweis </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"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </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"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100288.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100290.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100292.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|