<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>javathreads.de &#187; Hibernate</title>
	<atom:link href="http://javathreads.de/tag/hibernate/feed/" rel="self" type="application/rss+xml" />
	<link>http://javathreads.de</link>
	<description>Blog rund um Java und Web Entwicklung</description>
	<lastBuildDate>Wed, 02 Nov 2011 10:37:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hibernate Validation Annotationen f&#252;r Entity Beans</title>
		<link>http://javathreads.de/2009/06/hibernate-validation-annotationen-fr-entity-beans/</link>
		<comments>http://javathreads.de/2009/06/hibernate-validation-annotationen-fr-entity-beans/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 21:00:53 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Validierung]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=112</guid>
		<description><![CDATA[Einer der wohl gr&#246;&#223;ten Vorteile neben den JPA Annotationen f&#252;r die Beschreibung des Datenbankschemas bei der Verwendung von EJB 3 Entity Beans ist wohl die Nutzung von Validierungs-Annotationen (Constraints) direkt an den Attributen Entity Bean. Verwendet man Hibernate als JPA Implementierung kann man auf ein ganze Menge vordefinierter Validatoren zur&#252;ckgreifen die direkt verf&#252;gbar und durch [...]]]></description>
			<content:encoded><![CDATA[<p>Einer der wohl gr&#246;&#223;ten Vorteile neben den JPA Annotationen f&#252;r die Beschreibung des Datenbankschemas bei der Verwendung von EJB 3 Entity Beans ist wohl die Nutzung von Validierungs-Annotationen (Constraints) direkt an den Attributen Entity Bean. Verwendet man Hibernate als JPA Implementierung kann man auf ein ganze Menge vordefinierter Validatoren zur&#252;ckgreifen die direkt verf&#252;gbar und durch ihre Namen auch selbsterkl&#228;rend sind.</p>
<p>So k&#246;nnte z.B. die Entity Bean &#8220;User&#8221; wie folgt aussehen:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#646464">@Entity</span>
<span style="color:#7F0074;"><b>public</b></span> <span style="color:#7F0074;"><b>class</b></span> User {

  <span style="color:#646464">@Id</span>
  <span style="color:#7F0074;"><b>private</b></span> Long id;

  <span style="color:#646464">@Length(min</span> = 5, max = 50)
  <span style="color:#646464">@Pattern</span>(regex=<span style="color:#2A00FF;">"[a-zA-Z0-9]+"</span>)
  <span style="color:#646464">@NotNull</span>
  <span style="color:#7F0074;"><b>private</b></span> String name;

  <span style="color:#646464">@Email</span>
  <span style="color:#646464">@NotNull</span>
  <span style="color:#7F0074;"><b>private</b></span> String email;

  <span style="color:#646464">@Past</span>
  <span style="color:#7F0074;"><b>private</b></span> Date birthday;

  <span style="color:#3F7F5F">// Getter &#038; Setter</span>
}</pre>
</div>
<p>Der Hibernate Validator arbeitet auf zwei Ebenen mit den Constraints. Zum einen die f&#252;r Anwendungen sehr hilfreiche Funktion des &#8220;In-Memory-Checks&#8221; f&#252;r Instanzen. In diesem Fall wird noch vor der eigentlichen Datenbank Operation gegen die konfigurierten Constraints gepr&#252;ft. Zum anderen k&#246;nnen ein paar Hibernate Constraints direkt in das Datenbankschema &#252;bernommen und somit noch einmal von der Datenbank selbst gepr&#252;ft werden.</p>
<p>Im folgenden noch die Tabelle aller vordefinierten Hibernate Validation Annotationen:</p>
<table class="tableList" style="width: 100%">
<tr>
<td class="tableListHeadline">Annotation</td>
<td class="tableListHeadline">&#220;berpr&#252;fung auf</td>
<td class="tableListHeadline">DB Schema Anpassung</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Length(max=,min=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r ein String Attribut und pr&#252;ft die Anzahl der Zeichen
</td>
<td class="tableListTdText">
Spaltenl&#228;nge mit max versehen
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Max(value=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r eine Zahl (oder eine String welcher eine Zahl repr&#228;sentiert) und pr&#252;ft ob der Wert kleiner oder gleich der Angabe ist
</td>
<td class="tableListTdText">
f&#252;gt &#8220;check&#8221; Constraint der Spalte hinzu
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Min(value=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r eine Zahl (oder eine String welcher eine Zahl repr&#228;sentiert) und pr&#252;ft ob der Wert gr&#246;&#223;er oder gleich der Angabe ist
</td>
<td class="tableListTdText">
f&#252;gt Check Constraint der Spalte hinzu
</td>
</tr>
<tr>
<td class="tableListTdDesc">
@NotNull
</td>
<td class="tableListTdText">
gilt f&#252;r alle Attribute und pr&#252;ft ob der Wert gesetzt ist (nicht <code>null</code>)
</td>
<td class="tableListTdText">
Not Null Constraint an Spalte
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@NotEmpty</code>
</td>
<td class="tableListTdText">
gilt f&#252;r alle Attribute und pr&#252;ft ob der Wert nicht <code>null</code> und zudem nicht leer (Leerstring) ist
</td>
<td class="tableListTdText">
f&#252;gt f&#252;r einen String das Not Null Constraint an Spalte
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Past</code>
</td>
<td class="tableListTdText">
gilt f&#252;r <code>Date</code> oder <code>Calendar</code> Typen und pr&#252;ft ob das Datum in der Vergangenheit liegt
</td>
<td class="tableListTdText">
f&#252;gt Check Constraint der Spalte hinzu
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Future</code>
</td>
<td class="tableListTdText">
gilt f&#252;r <code>Date</code> oder <code>Calendar</code> Typen und pr&#252;ft ob das Datum in der Zukunft liegt
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Pattern(regex="")</code>
</td>
<td class="tableListTdText">
gilt f&#252;r alle Attribute und pr&#252;ft ob der Wert dem regul&#228;ren Ausdruck entspricht
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Range(min=, max=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r eine Zahl (oder eine String welcher eine Zahl repr&#228;sentiert) und pr&#252;ft ob die Zahl in dem Wertebereich zwischen min und max (inklusive) liegt
</td>
<td class="tableListTdText">
f&#252;gt Check Constraint der Spalte hinzu
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Size(min=, max=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r ein Array, Collection oder Map und pr&#252;ft ob die Anzahl der enthaltenen Elemente zwischen min und max (inklusive) liegt
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Email</code>
</td>
<td class="tableListTdText">
gilt f&#252;r einen String und pr&#252;ft ob dieser einer E-Mail Beschreibung laut Spezifikation entspricht
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@CreditCardNumber</code>
</td>
<td class="tableListTdText">
gilt f&#252;r einen String und pr&#252;ft ob dieser einer Kreditkartennummer entspricht
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Valid</code>
</td>
<td class="tableListTdText">
gilt f&#252;r ein Objekt, Collection oder Array und pr&#252;ft deren Validierung ab (bei Collection oder Array rekursiv alle Elemente)
</td>
<td class="tableListTdText">
-
</td>
</tr>
</table>
<p>Mit diesem Set an Hibernate Annotationen d&#252;rfte man die normalen und h&#228;ufigsten Anforderungen an die Validierung erf&#252;llt werden. Das m&#228;chtigste Constraint d&#252;rfte die <code>@Pattern(regex="")</code> sein, die man mit regul&#228;ren Ausdr&#252;cken bef&#252;llen kann.</p>
<p>Als letzte Information in diesem Artikel noch der Hinweis, dass f&#252;r jede Hibernate Annotation ein Standardfehlertext existiert, der aber angepasst werden kann. So kann jede gesetzte Annotation mit einer eigenen Fehlermeldung versehen werden. Daf&#252;r dient das Attribut <code>message</code> und wird in der Exception oder dem <code>InvalidValue</code> Objekt bei einer Constraint Verletzung gesetzt. Hier noch ein Beispiel f&#252;r das Verwenden von Nachrichten:</p>
<div class="codebox">
<pre style="margin:0;padding:0">  <span style="color:#646464">@Length(min</span> = 5, max = 50, message=<span style="color:#2A00FF;">"Username muss zwischen 5 und 50 Zeichen lang sein"</span>)
  <span style="color:#7F0074;"><b>private</b></span> String name;

  <span style="color:#646464">@Past(message=<span style="color:#2A00FF;">"Der</span> Geburtstag muss in der Vergangenheit liegen"</span>)
  <span style="color:#7F0074;"><b>private</b></span> Date birthday;</pre>
</div>
<p>Nat&#252;rlich kann auch internationalisiert werden. Dazu einfach eine <code>ValidatorMessages.properties</code> bzw. ValidatorMessages_de.properties erstellen und im Classpath ablegen und die entsprechenden keys anpassen oder eigene erstellen:</p>
<div class="codebox">
usernameLength=Username muss zwischen 5 und 50 Zeichen lang sein<br />
bdayPast=Der Geburtstag muss in der Vergangenheit liegen
</div>
<p>Und in der Klassen dann die Keys mit geschweiften Klammern verwenden:</p>
<div class="codebox">
<pre style="margin:0;padding:0">  <span style="color:#646464">@Length(min</span> = 5, max = 50, message=<span style="color:#2A00FF;">"{usernameLength}"</span>)
  <span style="color:#7F0074;"><b>private</b></span> String name;

  <span style="color:#646464">@Past</span>(message=<span style="color:#2A00FF;">"{bdayPast}"</span>)
  <span style="color:#7F0074;"><b>private</b></span> Date birthday;</pre>
</div>
<p>Selbst wenn man die Validierung noch nicht im Frontend eingebaut oder in der Anwendung verwendet lohnt es sich diese in der Entity Bean zu konfigurieren. Neben den direkt im Datenbankschema eingebauten Constraints dient es bei der Entwicklung und Verwendung der Entity Beans absolut der &#220;bersicht und zentralisiert die Vorgaben der Validierung.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/06/hibernate-validation-annotationen-fr-entity-beans/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>DB Schema aus JPA Entit&#228;ten mit Hilfe von Eclipse WTP und den Hibernate Tools generieren lassen</title>
		<link>http://javathreads.de/2009/04/db-schema-aus-jpa-entitaeten-mit-hilfe-von-eclipse-wtp-und-den-hibernate-tools-generieren-lassen/</link>
		<comments>http://javathreads.de/2009/04/db-schema-aus-jpa-entitaeten-mit-hilfe-von-eclipse-wtp-und-den-hibernate-tools-generieren-lassen/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 06:00:20 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[DDL]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Eclpse Ganymede]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Hibernate Tools]]></category>
		<category><![CDATA[JBoss Tools]]></category>
		<category><![CDATA[JPA]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=1384</guid>
		<description><![CDATA[Arbeitet man mit JPA (Java Persistence API) und konfiguriert die Entity Beans mit Hilfe von javax.persistence Annotationen stellt sich immer die Frage wie man von den modellierten Entity Beans an das Datenbankschema f&#252;r die entsprechende Zieldatenbeank gelangt.



Entity Bean mit JPA Annotationen


Dazugeh&#246;riges SQL Schema f&#252;r diese Entity Bean











Meistens bringen die verschiedenen JPA Implementierungen eigene Tools mit. [...]]]></description>
			<content:encoded><![CDATA[<p>Arbeitet man mit JPA (Java Persistence API) und konfiguriert die Entity Beans mit Hilfe von <code>javax.persistence</code> Annotationen stellt sich immer die Frage wie man von den modellierten Entity Beans an das Datenbankschema f&#252;r die entsprechende Zieldatenbeank gelangt.</p>
<table style="width:100%">
<tr>
<td style="width:50%">
Entity Bean mit JPA Annotationen
</td>
<td style="width:50%">
Dazugeh&#246;riges SQL Schema f&#252;r diese Entity Bean
</td>
</tr>
<tr>
<td style="width:50%">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddlsnippetentity2.png" alt="Entity Bean mit JPA Annotationen" title="Entity Bean mit JPA Annotationen" width="300" height="332" class="borderGray alignnone size-full wp-image-1414" />
</td>
<td style="width:50%">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddlsnippetsql.png" alt="Entity Schema" title="Entity Schema" width="300" height="332" class="borderGray alignnone size-full wp-image-1412" />
</td>
</tr>
</table>
<p>Meistens bringen die verschiedenen JPA Implementierungen eigene Tools mit. Verwendet man z.B. Hibernate kann man zum Beispiel die von <a href="http://www.hibernate.org/hib_docs/reference/en/html/toolsetguide.html">Konsole Tools</a> in Form eines ANT Tasks verwenden. Arbeitet man mit der Eclipse Ganymede IDE hat man mit dem Web Tools Subprojekt &#8220;Dali&#8221; (<a href="http://www.eclipse.org/webtools/dali/main.php">Dali JPA Tools</a>) die M&#246;glichkeit sich das DB Schema mit Hilfe eines Eclipse Dialogs generieren zu lassen.  Ich habe schon mal bei der Vorstellung der JBoss Tools 3 Alpha Version <a href="http://javathreads.de/2008/08/jboss-tools-300-alpha1-langsam-geht-es-vorwaerts/">darauf hingewiesen</a>, dass das WTP Dali Projekt ab Version 3 unterst&#252;tzt wird.</p>
<div class="subHeadline">Kurze Anleitung</div>
<p>Nachdem ich diesen Artikel in der ausf&#252;hrlichen Version erstellt hatte kam mir dieser mehr doch sehr lang vor obwohl das Konfigurieren an sich relativ schnell geht. Dahier hier die wenigen Schritte in absoluter Kurzform:</p>
<ul>
<li>Projekt Facet &#8220;JPA Persistence&#8221; dem EJB Projekt hinzuf&#252;gen (Projekt Properties)</li>
<li>JPA Plattform und DB Verbindung konfigurieren (Projekt Properties)</li>
<li>Im Cotextmen&#252; auf dem EJB-Projekt &#8220;JPA-Tools->Generate DDL&#8230;&#8221; w&#228;hlen</li>
<li>Im DDL Generation Dialog das Zielverzeichnis, die Ausgabedatei und Hibernate Console- (konfigurierbar &#252;ber die Hibernate Perspektive) oder DB-Konfiguration angeben. Dialog mit &#8220;Finish&#8221; beenden -> DDL Datei wird erstellt.</li>
</ul>
<div class="subHeadline">Ausf&#252;hrliche Anleitung</div>
<p>Im Folgenden wird anhand meines kleinen <a href="http://java-schnipsel.de">Java Schnipsel</a> Projektes gezeigt wie das Datenbankschema, genauer gesagt die DDL (Data Definition Language) Datei, mit Eclipse generiert werden kann. Dieses Projekt verwendet Hibernate und somit werden aus den JBoss Tools Plugins das Hibernate Tools Eclipse Plugin ben&#246;tigt. Nun sind die JBoss Tools 3.0.0 endlich <a href="http://javathreads.de/2009/03/jboss-tools-300-ga-fuer-eclipse-ganymede-verfuegbar/">offiziell Stable erschienen</a> und da ist es an der Zeit dieses Feature mal auszuprobieren.</p>
<p>Im ersten Schritt sollte &#252;berpr&#252;ft werden ob die Hibernate Tools installiert sind. Aus den JBoss Tools Eclipse Plugins wird f&#252;r das Generieren der DDL Datei die Hibernate Tools ben&#246;tigt. F&#252;r eine Installationsanleitung der JBoss Tools siehe <a href="http://javathreads.de/2009/03/jboss-tools-300-ga-fuer-eclipse-ganymede-verfuegbar/">hier</a>.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddlhibernatetoolsaddon.png" alt="JBoss Tools Eclipse Plugins - Hibernate Tools" title="JBoss Tools Eclipse Plugins - Hibernate Tools" width="600" height="88" class="borderGray alignnone size-full wp-image-1389" />
</div>
<p>Mein Beispielprojekt ist in der f&#252;r Eclipse normalen JEE Projektstruktur erstellt worden (mit dem <a href="http://javathreads.de/2008/09/tutorial-mit-jboss-seam-und-jee5-unter-eclipse-starten/">Seam Web Project Wizzard</a>):</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddlhibernatetoolsprojektstruktur.png" alt="Eclipse JEE Projektstruktur" title="Eclipse JEE Projektstruktur" width="600" height="131" class="borderGray alignnone size-full wp-image-1388" />
</div>
<p>Hat man eine solche Projektstruktur muss man nun das JPA Project Facet hinzuf&#252;gen. Dazu auf dem EJB Projekt aus dem Context Men&#252; (recht Maustaste) &#8220;Properties&#8221; aufrufen. Im Properties Dialog &#8220;Project Facets&#8221; selektieren und dort das Facet &#8220;Java Persistence&#8221; ausw&#228;hlen:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddlprojectfacets3.png" alt="Project Facet &quot;Java Persistence&quot;" title="Project Facet &quot;Java Persistence&quot;" width="600" height="402" class="borderGray alignnone size-full wp-image-1402" />
</div>
<p>Wenn das Facet &#8220;Java Persistence&#8221; selektiert wurde erscheint unten im gelben Hintergrund der Hinweis, dass weitere Konfigurationsm&#246;glichkeiten bestehen (&#8220;Further configuration available&#8221;). Am einfachsten ist es diese Konfiguration direkt auszuw&#228;hlen. Hat man die Einstellung mit &#8220;Apply&#8221; best&#228;tigt einfach das Facet noch einmal deslektieren, Apply dr&#252;cken und das Facet wieder selektieren.<br />
In dem Dialog &#8220;Modify Facet Project -> JPA Facet&#8221; muss nun die verwendete JPA Platform und die DB Verbindung konfiguriert werden. Ich verwende Hibernate und habe meine MySQL Verbindung konfiguriert. Man kann direkt von diesem Dialog aus eine neue DB Verbindung konfigurieren, sofern man das noch nicht getan hat.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddlprojectfacetjpa.png" alt="JPA Facet Konfiguration" title="JPA Facet Konfiguration" width="525" height="229" class="borderGray alignnone size-full wp-image-1396" />
</div>
<p>Die zwei weiteren dort m&#246;glichen Einstellungen habe ich bei mir auf &#8220;Use implementation provided by server Runtime&#8221; (Die Server Runtime kann in den Properties unter dem Punkt &#8220;Targeted Runtimes&#8221; konfiguriert werden &#8211; verwendet man keinen Server wie den JBoss kann man die JPA Jars auch direkt angeben) und &#8220;Discover annotated classes automatically&#8221; gesetzt. Anschlie&#223;end den JPA Facet Dialog und anschlie&#223;end den Properties Dialog mit &#8220;Ok&#8221; beenden.</p>
<p>Hat man allerdings den Properties Dialog schon vor den zus&#228;tzlichen JPA Einstellungen mit &#8220;Ok&#8221; beendet muss man noch einmal die Properties f&#252;r das EJB Projekt aufrufen und kann dann aber den Men&#252;punkt &#8220;JPA&#8221; direkt selektieren und somit konfigurieren:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddlprojectfacetjpadirekt2.png" alt="JPA Facet Konfiguration im Properties Men&#252;" title="JPA Facet Konfiguration im Properties Men&#252;" width="600" height="254" class="borderGray alignnone size-full wp-image-1404" />
</div>
<p>Nachdem die Java Persistence Project Facets dem JEE Projekt hinzugef&#252;gt wurden ist im Context Men&#252;, sofern man dieses auf dem EJB Projekt aufruft, der Eintrag &#8220;JPA Tools&#8221; zu finden. Darin findet sich der Men&#252;punkt &#8220;Generate DDL&#8221;.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddljpatoolscontextmenu2.png" alt="Context Men&#252; JPA Tools -&gt; Generate DDL" title="Context Men&#252; JPA Tools -&gt; Generate DDL" width="600" height="325" class="borderGray alignnone size-full wp-image-1416" />
</div>
<p>Erh&#228;lt man nach dem Ausw&#228;hlen dieses Men&#252;punktes den Fehler &#8220;DDL Generation is not supported by the Generic Platform&#8221; hat man vergessen seinen JPA Platform (Hibernate, Toplink, ..) zu konfigurieren. Dazu einfach wieder in die EJB Projekt Properties und den Men&#252;punkt &#8220;JPA&#8221; selektieren und konfigurieren. Mehr Informantionen zu dieser Fehlermeldung auch <a href="http://dev.eclipse.org/newslists/news.eclipse.technology.dali/msg00324.html">hier</a>.<br />
Ist alles soweit korrekt konfiguriert &#246;ffnet sich der DDL Generation Dialog. Darin gibt man zuerst das Zielverzeichnis sowie den Namen der DDL Datei an. Die zweite wichtige Konfiguration ist der Hibernate Dialekt der verwendet werden soll. Dazu kann man entweder eine bereits durch die Hibernate Perspektive erstellte <a href="http://javathreads.de/2008/03/unterstuetzung-fuer-jpa-hibernate-tools-in-eclipse/">Hibernate Console Konfiguration</a> verwenden und diese mit der Checkbox &#8220;Use Console Konfiguration&#8221; verwenden oder wie in meinem Fall die bereits konfigurierte Datenbankverbindung. Der Dialekt kann dabei automatisch erkannt werden (<a href="http://javathreads.de/2009/02/zwingend-den-hibernate-dialekt-konfigurieren/">ich berichtete dar&#252;ber</a>) oder direkt angeben:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddlgenerationdialog.png" alt="DDL Generation Dialog" title="DDL Generation Dialog" width="600" height="466" class="alignnone size-full wp-image-1407" />
</div>
<p>Ist alles korrekt konfiguriert wird durch den Button &#8220;Finish&#8221; das Generieren der DDL in der gew&#252;nschten Zieldatei gestartet. Das kann einen kleinen Moment dauern und anschlie&#223;end ist diese Schemadatei auch unter der gew&#252;nschten Position (bei mir im EJB-Projekt im Ordner ejbModule) zu finden:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/04/jpaddldatei.png" alt="DDL Datei: schema.ddl" title="DDL Datei: schema.ddl" width="600" height="276" class="borderGray alignnone size-full wp-image-1408" />
</div>
<p>Gerade f&#252;r die erste Entwicklungszeit und dem Erstellen der Entit&#228;ten ist diese einfach DDL Generierung sehr n&#252;tzlich. Sieht man doch direkt was f&#252;r Datenbanktypen aus den Java Attributen erstellt werden.</p>
<p>Alternativ kann man mit den Hibernate Tools &#252;ber die Hibernate Perspektive das Schema auch direkt in der DB erstellen. Vor gut einem Jahr habe ich dazu einen <a href="http://javathreads.de/2008/03/unterstuetzung-fuer-jpa-hibernate-tools-in-eclipse/">kleinen Artikel erstellt</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/04/db-schema-aus-jpa-entitaeten-mit-hilfe-von-eclipse-wtp-und-den-hibernate-tools-generieren-lassen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zwingend den Hibernate Dialekt konfigurieren?</title>
		<link>http://javathreads.de/2009/02/zwingend-den-hibernate-dialekt-konfigurieren/</link>
		<comments>http://javathreads.de/2009/02/zwingend-den-hibernate-dialekt-konfigurieren/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 21:00:31 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Hibernate Dialect]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[persistence.xml]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=1085</guid>
		<description><![CDATA[Wer mit Hibernate arbeitet muss eine persistence.xml im Classpath unterhalb des Ordners META-INF liegen haben. Die wichtigsten Konfigurationsparameter sind normalerweise der Transaktionstyp oder der Datasource JNDI Name, der Provider, die Entit&#228;ten (jar Datei oder Klassenangabe) und normalerweise der Datenbankdialekt. Im Regefall sieht sie dann wie folgt (oder &#228;hnlich) aus:

&#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62;
&#60;persistence xmlns=&#34;http://java.sun.com/xml/ns/persistence&#34;
  xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
  [...]]]></description>
			<content:encoded><![CDATA[<p>Wer mit Hibernate arbeitet muss eine <span class="code">persistence.xml</span> im Classpath unterhalb des Ordners <span class="code">META-INF</span> liegen haben. Die wichtigsten Konfigurationsparameter sind normalerweise der Transaktionstyp oder der Datasource JNDI Name, der Provider, die Entit&#228;ten (jar Datei oder Klassenangabe) und normalerweise der Datenbankdialekt. Im Regefall sieht sie dann wie folgt (oder &#228;hnlich) aus:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;</span><span style="color: #0000FF; ">?&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence </span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">=&quot;http://java.sun.com/xml/ns/persistence&quot;</span><span style="color: #FF0000; ">
  xmlns:xsi</span><span style="color: #0000FF; ">=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span><span style="color: #FF0000; ">
  xsi:schemaLocation</span><span style="color: #0000FF; ">=&quot;http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&quot;</span><span style="color: #FF0000; ">
  version</span><span style="color: #0000FF; ">=&quot;1.0&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">

  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence-unit </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;MyEJBApp&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">provider</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.hibernate.ejb.HibernatePersistence</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">provider</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">jta-data-source</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">java:/MyEJBAppDatasource</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">jta-data-source</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
      </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.dialect&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;org.hibernate.dialect.MySQLDialect&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
      </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.hbm2ddl.auto&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;validate&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
      </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.show_sql&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;true&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
      </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.format_sql&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;true&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence-unit</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Der interessante Punkt ist die Angabe des Hibernate Dialekts. Dieser wird mit dem Schl&#252;sselwort <b><span class="code">hibernate.dialect</span></b> konfiguriert:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.dialect&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;org.hibernate.dialect.MySQLDialect&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span></pre>
</div>
<p>Es werden von Hibernate relativ viele Dialekte angeboten, so dass eine breite Unterst&#252;tzung f&#252;r die verschiedenen Datenbanken besteht. Unter den Angebotenen sind die &#252;blichen Verd&#228;chtigen wie z.B.</p>
<ul>
<li>DB2 (<span class="code">org.hibernate.dialect.DB2Dialect</span>)</li>
<li>PostgreSQL (<span class="code">org.hibernate.dialect.PostgreSQLDialect</span>)</li>
<li>MySQL (<span class="code">org.hibernate.dialect.MySQLDialect</span>)</li>
<li>Oracle (<span class="code">org.hibernate.dialect.OracleDialect</span>)</li>
<li>Sybase (<span class="code">org.hibernate.dialect.SybaseDialect</span>)</li>
<li>MS SQL Server (<span class="code">org.hibernate.dialect.SQLServerDialect</span>)</li>
<li>HSQLDB/HypersonicSQL (<span class="code">org.hibernate.dialect.HSQLDialect</span>) </li>
<li>Derby (<span class="code">org.hibernate.dialect.DerbyDialect</span>) </li>
</ul>
<p>und noch einige andere.</p>
<p>Was ich bisher nicht wusste ist, dass die Angabe des Dialektes optional ist. L&#228;sst man die Angabe weg versucht Hibernate die korrekte Implementierung von <span class="code">org.hibernate.dialect.Dialect</span> anhand der JDBC Metadaten herauszufinden die vom JDBC Treiber zur&#252;ckgegeben/geliefert werden.<br />
F&#252;r die g&#228;ngigsten Datenbanken sollte es somit kein Problem sein den Dialekt einfach wegzulassen. Der gro&#223;e Vorteil an dieser Stelle w&#228;re, dass man tats&#228;chlich ein EAR relativ unabh&#228;ngig von der Datenbank ausliefern k&#246;nnte. Entscheidet man sich f&#252;r das weglassen sollte man zumindest den Hibernate Konfigurationsparamater <span class="code"></span> auf <span class="code">validate</span> setzen um eine DB Schemavalidierung beim Starten der Anwendung zu haben.</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.hbm2ddl.auto&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;validate&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span></pre>
</div>
<p>Stimmt etwas mit dem f&#252;r den dynamisch gefundenen Datenbankdialekt das Schema nicht w&#252;rde zumindest eine Exception geworfen werden.</p>
<p>Nachlesen kann man das in der offiziellen Hibernate Dokumenation im <a href="http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-optional-dialects">Kapitel 3.4 unter &#8220;Optional configuration properties&#8221;</a>. Gleich der erste beschriebene Parameter ist der <span class="code">hibernate.dialect</span>.<br />
In Kapitel 3.4.1, weiter unten auf dieser Seite, sind zudem alle implementierten Dialekte aufgelistet.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/02/zwingend-den-hibernate-dialekt-konfigurieren/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Prepared Statement Parameter von Hibernate ausgeben lassen</title>
		<link>http://javathreads.de/2008/08/prepared-statement-parameter-von-hibernate-ausgeben-lassen/</link>
		<comments>http://javathreads.de/2008/08/prepared-statement-parameter-von-hibernate-ausgeben-lassen/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 07:15:14 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss AS]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[Konfiguration]]></category>
		<category><![CDATA[Log4J]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=43</guid>
		<description><![CDATA[Wer mit Hibernate arbeitet dem f&#228;llt fr&#252;her oder sp&#228;ter auf, dass die eingesetzten Parameter bei ausgef&#252;hrten SQL Statements nicht im Logfile (oder auf der Konsole) zu sehen sind. Vielmehr sehen die SQL Statements zum Beispiel wie folgt aus:

21:10:03,406 INFO  [STDOUT] Hibernate:
    insert
    into
      [...]]]></description>
			<content:encoded><![CDATA[<p>Wer mit Hibernate arbeitet dem f&#228;llt fr&#252;her oder sp&#228;ter auf, dass die eingesetzten Parameter bei ausgef&#252;hrten SQL Statements nicht im Logfile (oder auf der Konsole) zu sehen sind. Vielmehr sehen die SQL Statements zum Beispiel wie folgt aus:</p>
<div class="codebox">
<pre><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">10</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">03</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">406</span><span style="color: #000000; "> INFO  </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">STDOUT</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> Hibernate:
    </span><span style="color: #0000FF; ">insert</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">into</span><span style="color: #000000; ">
        REGISTERED_USER
        (version, NAME, USER_TYPE, CONF_FK, id)
    </span><span style="color: #0000FF; ">values</span><span style="color: #000000; ">
        (?, ?, ?, ?, ?)</span></pre>
</div>
<p>Das f&#252;r den Entwickler eigentlich interessante, n&#228;mlich die Parameter in der <span class="code">values</span> Zeile, wird wegen der Verwendung von Prepared Statements  nur durch Fragezeichen ausgegeben.</p>
<p>Die allgemein g&#252;ltige L&#246;sung daf&#252;r ist das Log Level f&#252;r Hibernate Kategorie <span class="code">org.hibernate.type</span> auf <span class="code">TRACE</span> zu setzen. In einer <span class="code">log4j.properties</span> Datei reichen die folgenden beiden Angaben um die SQL Statements sowie deren Paramter im Log auszugeben:</p>
<div class="codebox">
log4j.logger.org.hibernate.SQL = TRACE<br />
log4j.logger.org.hibernate.type = TRACE
</div>
<p>Arbeitet man mit der log4j.xml Konfigurationsdatei muss man die Kategorie wie folgt konfigurieren:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">category </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;org.hibernate.type&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">priority </span><span style="color: #FF0000; ">value</span><span style="color: #0000FF; ">=&quot;TRACE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender-ref </span><span style="color: #FF0000; ">ref</span><span style="color: #0000FF; ">=&quot;CONSOLE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">category</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Die Kategorie <span class="code">org.hibernate.SQL</apn> muss man nicht unbedingt konfigurieren wenn man in der Hibernate Konfiguration, die bei der Nutzung von JPA in der Datei <span class="code">persistence.xml</span> zu finden ist, den Parameter <span class="code">hibernate.show_sql</span> auf <span class="code">true</span> setzt:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.show_sql&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;true&quot;</span><span style="color: #0000FF; ">/&gt;</span></pre>
</div>
<p>&#220;berschreibt man die in der log4j Konfiguration die Kategorie <span class="code">org.hibernate.SQL</span> hat diese Einstellung in der <span class="code">persistence.xml</span> keine Wirkung.</p>
<div class="subHeadline ">Hibernate unter JBoss Seam und JBoss AS zum reden bringen</div>
<p>Arbeitet man mit JBoss Seam unter dem JBoss AS verh&#228;lt es sich grunds&#228;tzlich genauso wie oben beschrieben: </p>
<ul>
<li>Konfiguration des <span class="code">show_sql</span> Flags auf den Wert <span class="code">true</span> in der <span class="code">persistence.xml</span></li>
<li>Die Log4J Konfiguration f&#252;r Hibernate erweitern: Im JBoss AS Installationsordner unter <span class="code">&lt;JBossAs&gt;\server\default\conf</span> die Datei <span class="code">jboss-log4j.xml</span> editieren und die Hibernate Kategorie <span class="code">org.hibernate.type</span> wie oben beschrieben hinzuf&#252;gen</li>
</ul>
<p>Da hier das Log Level auf <span class="code">TRACE</span> gesetzt wird muss man das Level f&#252;r den Appender auch auf <span class="code">TRACE</span> setzen um den entsprechenden Effekt zu erhalten. Es ist nicht unbedingt ratsam den Default Appender, hier <span class="code">CONSOLE</span> auf <span class="code">TRACE</span> zu setzen weil sonst alle f&#252;r diesen Appender konfigurierten Kategorien viel und laut sprechen.<br />
Es bietet sich stattdessen an einen eigenen Hibernate Appender zu erstellen und nur diesen auf <span class="code">TRACE</span> zu setzen. Bei mir sieht die <span class="code">jboss-log4j.xml</span> f&#252;r Hibernate wie folgt aus. Zuerst der Hibernate Appender:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;HIBERNATE&quot;</span><span style="color: #FF0000; "> class</span><span style="color: #0000FF; ">=&quot;org.apache.log4j.ConsoleAppender&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">errorHandler </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">=&quot;org.jboss.logging.util.OnlyOnceErrorHandler&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;Target&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;System.out&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;Threshold&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;TRACE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">

  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">layout </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">=&quot;org.apache.log4j.PatternLayout&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;ConversionPattern&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;%d{ABSOLUTE} %-5p [%c{1}] %m%n&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">layout</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">appender</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Die Hibernate <span class="code">org.hibernate.type</span> Kategorie Konfiguration:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">category </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;org.hibernate.type&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">priority </span><span style="color: #FF0000; ">value</span><span style="color: #0000FF; ">=&quot;TRACE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender-ref </span><span style="color: #FF0000; ">ref</span><span style="color: #0000FF; ">=&quot;HIBERNATE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">category</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Eigentlich ziemlich simpel.</p>
<p>F&#252;hrt man nun das am Anfang beschriebene SQL Statement nochmal aus ist auf der Konsole folgendes zu sehen:</p>
<div class="codebox">
<pre><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> INFO  </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">STDOUT</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> Hibernate:
    </span><span style="color: #0000FF; ">insert</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">into</span><span style="color: #000000; ">
        REGISTERED_USER
        (version, NAME, USER_TYPE, CONF_FK, id)
    </span><span style="color: #0000FF; ">values</span><span style="color: #000000; ">
        (?, ?, ?, ?, ?)
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> TRACE </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">IntegerType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">0</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">1</span><span style="color: #000000; ">
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> TRACE </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">StringType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">Markus</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> DEBUG </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">EnumType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> Binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">ADMIN</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">3</span><span style="color: #000000; ">
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> TRACE </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">LongType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">41</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">4</span><span style="color: #000000; ">
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> TRACE </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">LongType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">41</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">5</span></pre>
</div>
<p>Und kaum hat man diese wenigen Konfigurationselemente hinzugef&#252;gt spricht Hibernate schon eine viel deutlichere und sch&#246;nere Sprache f&#252;r uns.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2008/08/prepared-statement-parameter-von-hibernate-ausgeben-lassen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Unterst&#252;tzung f&#252;r JPA &#8211; Hibernate Tools in Eclipse</title>
		<link>http://javathreads.de/2008/03/unterstuetzung-fuer-jpa-hibernate-tools-in-eclipse/</link>
		<comments>http://javathreads.de/2008/03/unterstuetzung-fuer-jpa-hibernate-tools-in-eclipse/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 18:22:38 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Eclipse Plugins]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Hibernate Tools]]></category>
		<category><![CDATA[JBoss Tools]]></category>
		<category><![CDATA[JPA]]></category>

		<guid isPermaLink="false">http://javathreads.de/2008/03/unterstuetzung-fuer-jpa-hibernate-tools-in-eclipse/</guid>
		<description><![CDATA[Wer mit der Java Persistence API (JPA) arbeitet, wie zum Beispiel mit Hibernate 3 oder JEE 5, hat die M&#246;glichkeit eine bequeme Unterst&#252;tzung durch die Verwendung der Hibernate Tools in Eclipse zu bekommen. 
Die Hibernate Tools sind eine Menge von Tools f&#252;r Hibernate 3 und k&#246;nnen in Eclipse als Plugins oder als Ant Tasks verwendet [...]]]></description>
			<content:encoded><![CDATA[<p>Wer mit der <a href="http://java.sun.com/developer/technicalArticles/J2EE/jpa/">Java Persistence API</a> (JPA) arbeitet, wie zum Beispiel mit Hibernate 3 oder JEE 5, hat die M&#246;glichkeit eine bequeme Unterst&#252;tzung durch die Verwendung der <a href="http://www.hibernate.org/255.html">Hibernate Tools</a> in Eclipse zu bekommen. </p>
<p>Die Hibernate Tools sind eine Menge von Tools f&#252;r Hibernate 3 und k&#246;nnen in Eclipse als Plugins oder als Ant Tasks verwendet werden. Dabei sind die Hibernate Tools eine Hauptkomponente der JBoos Tools und somit werden sie auch von JBoss angeboten.</p>
<table style="width:100%">
<tr>
<td style="width:50%;text-align:center"><img src='http://javathreads.de/data/uploads/2008/03/hibernatetoolsentities.jpg' alt='Hibernate Tools - Entities' /></td>
<td>
<td style="width:50%;text-align:center"><img src='http://javathreads.de/data/uploads/2008/03/hibernatetoolsmappingxml.jpg' alt='Hibernate Tools - Mapping' /></td>
</tr>
</table>
<p>Dieser Artikel behandelt nur die Hibernate Tools als Eclipse Plugin und ist in die folgenden Abschnitten unterteilt:</p>
<ul>
<li><a href="#InstallationHibernateToolsPlugin">Installation des Hibernate Tools Eclipse Plugin</a></li>
<li><a href="#ErstellenHibernateKonfiguration">Erstellen einer Hibernate Konfiguration</a></li>
<li><a href="#DBSchemaErstellen">Datenbankschema erstellen/aktualisieren</a></li>
<li><a href="#HQLEditor">Java Persistence Query Statements ausf&#252;hren und testen</a></li>
<li><a href="#Fazit">Fazit</a></li>
</ul>
<p><span id="more-24"></span></p>
<div class="subHeadline"><a name="InstallationHibernateToolsPlugin" class="noLink">Installation des Hibernate Tools Eclipse Plugin</a></div>
<p>Die einfachste M&#246;glichkeit die Hibernate Tools als Eclipse Plugin zu installieren ist &#252;ber den Eclipse Update Manager (Help->Software Updates->Find and Install->Search for new features to install). Dort die JBoss Tools Update Seite  (<a href="http://download.jboss.org/jbosstools/updates/stable/">http://download.jboss.org/jbosstools/updates/stable/</a>) hinzuf&#252;gen.</p>
<div class="singleImgDiv"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolseclipseupdateseite.jpg' alt='JBoss Tools - Update Seite' title='JBoss Tools - Update Seite'/></div>
<p>Feature &#8220;Hibernate Tools&#8221; selektieren und Installation starten. Dazu einfach den Anweisungen folgen.</p>
<div class="singleImgDiv"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolseclipsepluginfeatures.jpg' alt='JBoss Tools - Hibernate Tools Feature' title='JBoss Tools - Hibernate Tools Feature' /></div>
<p>Die JBoss Tools k&#246;nnen nat&#252;rlich auch <a href="http://labs.jboss.com/tools/download/index.html">manuell heruntergeladen</a> werden.</p>
<div class="subHeadline"><a name="ErstellenHibernateKonfiguration" class="noLink">Erstellen einer Hibernate Konfiguration</a></div>
<p>Nach der Installation steht die Hibernate Tools Perspektive zur Verf&#252;gung. In dieser Perspektive wird eine Hibernate Konfiguration erstellt. Diese Hibernate Konfiguration ben&#246;tigt eine Hibernate Konfigurations Datei um die Container spezifischen Konfigurationen aus der persistence.xml zu &#252;berschreiben.</p>
<p>Diese Hibernate Konfigurations Datei, bei mir hei&#223;t sie &#8220;<span class="code">hibernate-tools.properties</span>&#8220;, kann irgendwo im Projekt angelegt werden und muss muss folgenden Inhalt habe:</p>
<pre name="code" class="java">
hibernate.connection.username=deinMySQLUser
hibernate.connection.password=deinMySQLPw
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.connection.url=jdbc:mysql://localhost/openwishes

hibernate.connection.provider_class=org.hibernate.connection.DriverManagerConnectionProvider
</pre>
<p>Nat&#252;rlich sollten noch passende und g&#252;ltige Daten angegeben werden. Dieses Beispiel bezieht sich auf meine lokale <a href="http://openwishes.de/">OpenWishes</a> MySQL Datenbank.</p>
<p>Als zweites wird noch eine <span class="code">persistence.xml</span> im Classpath ben&#246;tigt. Und zwar muss diese Datei, die genau diesen Namen haben muss, im Ordner <span class="code">/META-INF</span> liegen. Auch wenn diese Datei keine wirklichen Konfigurationen enth&#228;lt, so verlangen die Hibernate Tools f&#252;r die Erstellung einer Hibernate Konfiguration eben eine <span class="code">/META-INF/persistence.xml</span> im Classpath. Am besten erstellt man sich den <span class="code">/META-INF</span> Ordner im Source Verzeichnis.</p>
<pre name="code" class="xml">
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="OpenWishesPersistency">
	</persistence-unit>
</persistence>
</pre>
<p>Sind diese beiden Dateien vorhanden muss in die Hibernate Perspektive gewechselt und eine neue Hibernate Konfiguration erstellt werden. Dazu mit der rechten Maustaste auf den Hintergrund im Reiter &#8220;Hibernate Configurations&#8221; und &#8220;Add Configuration&#8230;&#8221; w&#228;hlen.</p>
<div class="singleImgDiv"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolshibernateaddconfiguration.png' alt='JBoss Tools - Hibernate Tools - Add Configuration' title='JBoss Tools - Hibernate Tools - Add Configuration'/></div>
<p>Bei der Konfiguration muss als Typ &#8220;JPA&#8221; gew&#228;hlt sowie das Projekt und die vorher erstellte Hibernate Konfigurationsdatei selektiert werden. Der Name kann frei bestimmt werden.</p>
<div class="singleImgDiv"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolshibernatekonfiguration.jpg' alt='JBoss Tools - Hibernate Tools - Konfiguration' title='JBoss Tools - Hibernate Tools - Konfiguration'/></div>
<p>Das ganze mit OK abschlie&#223;en und die Konfiguration ist erstellt. Bei Fehlern in der Konfiguration erscheinen die Meldungen der aufgetretenen Exception(s) in dem Error Log Panel. Leider wird man aus diesen oft nicht wirklich schlau daher lieber noch einmal die Erreichbarkeit der Datenbank, die angegeben Daten auf Korrektheit und die Verf&#252;gbarkeit des Treibers im Classpath pr&#252;fen um das schon einmal auszuschlie&#223;en.</p>
<div class="subHeadline"><a name="TestenKonfiguration" class="noLink">Testen der Konfiguration</a></div>
<p>Wenn aber alles in Ordnung ist kann nun die neu angelegte Konfiguration aufgeklappt und zwischen den drei Auswahlm&#246;glichkeiten &#8220;Configuration&#8221;, &#8220;Session Factory&#8221; und &#8220;Database&#8221; gew&#228;hlt werden. F&#252;r einen ersten Test kann z.B. der &#8220;Configuration&#8221; Zweig aufgeklappt werden und man m&#252;sste alle im Projekt konfigurierten Entit&#228;ten aufgelistet sehen. Mit einem Doppelklick auf die Entit&#228;t gelangt man in die entsprechende Java Klasse.</p>
<div class="singleImgDiv"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolshibernatekonfigurationentityconfiguration.png' alt='JBoss Tools - Hibernate Tools - Configuration Zweig' title='JBoss Tools - Hibernate Tools - Configuration Zweig'/></div>
<div class="subHeadline" style="margin-top:25px;"><a name="DBSchemaErstellen" class="noLink">Datenbankschema erstellen/aktualisieren</a></div>
<p>Ist man noch in der Entwicklung des Domain Modells und muss h&#228;ufig das Datenbank Schema aktualisieren so ist das mit den Hibernate Tools eine Sache von Sekunden.<br />
Nach der &#196;nderung einer Entit&#228;t (Klassen mit der @Entity Annotation) muss die Hibernate Konfiguration aktualisiert werden. Das erreicht man aus dem Kontextmen&#252; (rechte Maustaste) auf den &#8220;Configuration Zweig&#8221; der eingerichteten Konfiguration und der Anweisung &#8220;Refresh&#8221;. Anschlie&#223;end im Kontextmen&#252; der Hibernate Konfiguration den Men&#252;punkt &#8220;Run ShemaExport&#8221; aufrufen und nach einer erneuten Best&#228;tigung wird das Datenbankschema erneut erstellt.</p>
<div class="singleImgDiv">
<table style="width:100%">
<tr>
<td style="text-align:center"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolshibernaterefreshconfiguration.png' alt='JBoss Tools - Hibernate Tools - Refresh Configuration' title='JBoss Tools - Hibernate Tools - Refresh Configuration' /></td>
<td style="text-align:center"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolshibernaterunschemaexport.png' alt='JBoss Tools - Hibernate Tools - Run Shema Export' title='JBoss Tools - Hibernate Tools - Run Shema Export'/></td>
</tr>
</table>
</div>
<p>An dieser Stelle sollte man nat&#252;rlich vorsichtig sein, denn bereits in der Datenbank vorhandene Datens&#228;tze sind nat&#252;rlich anschlie&#223;end nicht mehr vorhanden.</p>
<p>Passend dazu ist ein weiteres sehr sch&#246;nes Feature die grafische Darstellung des Mappings zwischen einer Entit&#228;t und der Datenbanktabelle. So kann man das eben erstellte Schema ansehen und man k&#246;nnte diese Darstellung auch ohne weiteres in eine Dokumentation &#252;bernehmen.<br />
Diese Darstellung kann auch aus dem &#8220;Configuration&#8221; Zweig heraus aus ge&#246;ffnet werden. Einfach mit der rechten Maustaste auf eine Entit&#228;t klicken und &#8220;Open Mapping Diagram&#8221; selektieren.</p>
<div class="singleImgDiv"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolshibernateemtitymapping.jpg' alt='JBoss Tools - Hibernate Tools - Entity Mapping' title='JBoss Tools - Hibernate Tools - Entity Mapping'/></div>
<div class="subHeadline"><a name="HQLEditor" class="noLink">Java Persistence Query Statements ausf&#252;hren und testen</a></div>
<p>Das meiner Meinung nach n&#252;tzlichste Feature (neben der schnellen Aktualisierung des DB Schemas) ist das Austesten und schnelle Ausf&#252;hren von Java Persistence Query (JPQ) Statements; bei Hibernate auch Hibernate Query Language (HQL) genannt und bei JEE unter dem Stichwort Enterprise Java Beans Query Language (EJB-QL) zu finden.<br />
Den HQL Editor &#246;ffnet man aus dem Kontextem&#252; heraus aus. In dem HQL Editor muss man noch die gew&#252;nscht Hibernate Konfiguration selektieren und kann noch die Treffermene reduzieren.<br />
Nach dem Eingeben der Hibnerate Query und dem Ausf&#252;hren, gestartet durch den gr&#252;nen Pfeil oben links, erscheint in dem &#8220;Hibernate Query Result&#8221; Panel das erzielte Ergebnis. In dem dazugeh&#246;rigen Properties Panel erscheinen die geladenen Daten einer einzelnen selektierten Entit&#228;t. In dem Screenshot kann man sehen, dass selbst Objekte die als Referenz in der selektierten Entit&#228;t bestehen mit geladen werden. In diesem Fall ist es die Entit&#228;t &#8220;Item&#8221;.</p>
<div class="singleImgDiv"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolshibernatehqleditor.jpg' alt='JBoss Tools - Hibernate Tools - HQL Editor' title='JBoss Tools - Hibernate Tools - HQL Editor'/></div>
<p>Kleiner Hinweis: das Ergebnispanel &#246;ffnet sich nicht automatisch bei einer &#196;nderung des Inhalts und es muss somit manuel selektiert werden, wenn man sich gerade in einem anderen Panel, wie zum Beispiel dem &#8220;Error Log&#8221; Panel befindet.</p>
<p>Bei einem HQL Fehler wird man nat&#252;rlich auch wie bei einem SQL Statement darauf hingewiesen.</p>
<div class="singleImgDiv"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolshibernatehqleditorfehler.jpg' alt='JBoss Tools - Hibernate Tools - HQL Editor Fehler' title='JBoss Tools - Hibernate Tools - HQL Editor Fehler'/></div>
<p>Ein weiteres sehr sch&#246;nes Feature ist zu sehen was aus seinem HQL Statement in SQL gemacht wird, denn das gr&#246;&#223;te Problem der bequemen Datenbankabfragen mit Hilfe der JPQ Statements ist die Performance. Oft werden so viele JOINS und Subselects gemacht, dass es sich aufgrund der Performance nicht lohnt ein solches Statement abzusetzen. Aber dazu sollte man nat&#252;rlich wissen was Hibernate aus den HQL Statements f&#252;r SQL Statements erstellt. Und genau diese Antwort liefert das &#8220;Hibernate Dynamic SQL Preview&#8221; Panel.</p>
<div class="singleImgDiv"><img class="borderGray" src='http://javathreads.de/data/uploads/2008/03/jbosstoolshibernatehqlzusql.png' alt='JBoss Tools - Hibernate Tools - HQL zu SQL' title='JBoss Tools - Hibernate Tools - HQL zu SQL'/></div>
<div class="subHeadline"><a name="Fazit" class="noLink">Fazit</a></div>
<p>Die Hibernate Tools sind f&#252;r die Entwicklung mit JPA eine wirklich wertvolle Unterst&#252;tzung. Es ist m&#246;glich bei der Entwicklung des Domain Modells das Datenbank Schema schnell und unkompliziert zu erstellen bzw. anzupassen und das Mapping zwischen den Entit&#228;ten sowie den Tabellen mit grafischer Unterst&#252;tzung zu untersuchen.<br />
F&#252;r HQL bzw. EJB-QL Statements bietet der HQL Editor eine sehr praktische und schnelle M&#246;glichkeit das Statement auf Korrektheit und gew&#252;nschtes Ergebnis zu &#252;berpr&#252;fen.</p>
<p>Auch wenn man nicht mit JPA sondern noch mit den Hibernate XML Files arbeitet bieten das Hibernate Tools Plugin eine wertvolle Erweiterung wie z.b. das Autocomplete im hbm.xml Editor.</p>
<p>Insgesamt kann ich das Plugin absolut empfehlen weil es die Arbeit doch sehr erleichtert, wie wir bei der Entwicklung von <a href="http://openwishes.de/">OpenWishes</a> oft feststellen konnten.</p>
<p>F&#252;r Anmerkungen steht nat&#252;rlich die Kommentarfunktion zur Verf&#252;gung.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2008/03/unterstuetzung-fuer-jpa-hibernate-tools-in-eclipse/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

