{"id":172,"date":"2010-11-03T03:28:58","date_gmt":"2010-11-03T02:28:58","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=172"},"modified":"2010-11-26T23:23:56","modified_gmt":"2010-11-26T22:23:56","slug":"java-hibernate-tutorial","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/java-hibernate-tutorial\/","title":{"rendered":"Java Hibernate Tutorial"},"content":{"rendered":"<p>Nachdem ich mit <a href=\"https:\/\/d-mueller.de\/blog\/java-und-sqlite\/\">SQLite<\/a> das Java-Fass aufgemacht hab, gibts nun noch Hibernate hinterher. <a href=\"http:\/\/de.wikipedia.org\/wiki\/Hibernate_(Framework)\">Hibernate<\/a> ist wohl eines der bekanntesten ORM-Frameworks. Ich zeige das ganze anhand von Netbeans, aber auch hier sollte Eclipse nicht weit entfernt sein. Es wird frech davon ausgegangen, dass das Java-Plugin installiert ist.<\/p>\n<h3>1) Hibernate Plugin installieren<\/h3>\n<p>In Netbeans unter <i>Tools -> Plugins -> Availible Plugins -> Hibernate<\/i>. Sollte schmerzfrei durchlaufen.<\/p>\n<h3>2) Java Projekt anlegen<\/h3>\n<p><i>File -> New Projekt -> Java Application<\/i>. Darf auch eine DesktopApplication sein, wenn ihr den GUI-Builder (Swing) als Plugin mitinstalliert habt &#8211; tut aber f\u00fcr Hibernate nichts zur Sache. Die Standardeinstellungen tun es unter Netbeans f\u00fcr das neue Projekt.<\/p>\n<h3>3) Zu einer Datenbank verbinden<\/h3>\n<div id=\"attachment_173\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/1-dbconnection.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-173\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/1-dbconnection-150x150.png\" alt=\"Datenbankverbindung\" title=\"1-dbconnection\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-173\" \/><\/a><p id=\"caption-attachment-173\" class=\"wp-caption-text\">Datenbankverbindung<\/p><\/div>\n<p>Wenn unter <i>Services -> Databases<\/i> bereits die gew\u00fcnschte Datenbank angelegt wurde, einfach zu dieser connecten. Falls nicht: Rechtsklick auf Databases, <i>New Connection<\/i> und dann da die erforderlichen Parameter ausw\u00e4hlen. Ich habe es leider erfolglos mit einer SQLite-Datenbank versucht, weil Netbeans einen (definitiv gesetzten!) Primary Key vermisst. Also verwende ich eine MySQL Datenbank. Sollte dann so ungef\u00e4hr aussehen wie auf dem Bild.<\/p>\n<h3>4) Hibernate Config File<\/h3>\n<div id=\"attachment_174\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/2-hibernateconfig.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-174\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/2-hibernateconfig-150x150.png\" alt=\"Hibernate Config\" title=\"Hibernate Config\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-174\" \/><\/a><p id=\"caption-attachment-174\" class=\"wp-caption-text\">Hibernate Config<\/p><\/div>\n<p>Unter dem Reiter <i>Projects<\/i> auf das gerade angelegte Projekt per Rechtsklick <i>New -> Other<\/i> und dann da <i>Hibernate -> Hibernate Configuration Wizard<\/i>. Im Schritt &#8222;Select Data Source&#8220; ist dann die Datenbank aus Schritt 3 auszuw\u00e4hlen. Die frisch erstellte <i>hibernate.cfg.xml<\/i> (oder wie sie auch benannt ist) \u00f6ffnen und oben in den Reiter &#8222;XML&#8220; wechseln. Da sind dann die 2 Zeilen<\/p>\n<pre data-enlighter-language=\"xml\" class=\"EnlighterJSRAW\">\r\n&lt;property name=&quot;hibernate.show_sql&quot;&gt;true&lt;\/property&gt;\r\n&lt;property name=&quot;hibernate.query.factory_class&quot;&gt;org.hibernate.hql.classic.ClassicQueryTranslatorFactory&lt;\/property&gt;\r\n<\/pre>\n<p>so hinzuzuf\u00fcgen, dass es in etwa wie auf dem Bild rechts ausschaut.\n<\/p>\n<h3>5) HibernateUtil File<\/h3>\n<p>Jetzt zum Projekt ein neues &#8222;HibernateUtil&#8220;-File hinzuf\u00fcgen. Unter Package empfiehlt sich <i>[projektname].util<\/i>. File ist nach belieben zu benennen. Dieses File ist f\u00fcr die Initialisierung der Session-Verwaltung zust\u00e4ndig und muss nicht angefasst werden.<\/p>\n<h3>6) Hibernate Reverse Engineering Wizard<\/h3>\n<div id=\"attachment_175\" style=\"width: 160px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/3-reveng.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-175\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/3-reveng-150x150.png\" alt=\"Reverse Engineering\" title=\"Reverse Engineering\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-175\" \/><\/a><p id=\"caption-attachment-175\" class=\"wp-caption-text\">Reverse Engineering<\/p><\/div>\n<p>Nach Schema F ist jetzt ein <i>Hibernate Reverse Engineering Wizard<\/i> zum Projekt hinzuzuf\u00fcgen. Jetzt wirds interessant. Im Schritt &#8222;Database Tables&#8220; kann ausgew\u00e4hlt werden, f\u00fcr welche Tabellen der Datenbank Hibernate aktiviert werden soll. Im Zweifelsfalle erstmal eine Tabelle zum testen reinpacken, mehr kann man sp\u00e4ter immernoch dazunehmen.<\/p>\n<h3>7) Hibernate Mapping files and POJOs<\/h3>\n<div id=\"attachment_176\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/4-mapping.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-176\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/4-mapping-150x150.png\" alt=\"Mapping\" title=\"Mapping\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-176\" \/><\/a><p id=\"caption-attachment-176\" class=\"wp-caption-text\">Mapping<\/p><\/div>\n<p>Und nochmal wird der File-Wizard bem\u00fcht. Diesmal w\u00e4hlen wir <i>Hibernate Mapping files and POJOs from Database<\/i>. Unter &#8222;General Settings&#8220; keinen Haken anw\u00e4hlen, daf\u00fcr beide Haken bei &#8222;Code Generation Settings&#8220; w\u00e4hlen. Als Package kann man <i>projektname.entity<\/i> w\u00e4hlen. Sollte in etwa so wie auf dem Bild ausschauen. F\u00fcr jede Tabelle die ihr in Schritt 6) gew\u00e4hlt habt, wird nun automatisch unter <i>projektname.entity<\/i> eine <i>Tabellenname.java<\/i> sowie eine <i>Tabellenname.hbm.xml<\/i> Datei erstellt. Erstere ist die Klasse selbst, mit der ihr dann per Hibernate f\u00fcr diese Tabelle operiert, die zweite ist eine XML-Definition der Felder, die angesteuert werden sollen.<\/p>\n<p>Sollte man sich jetzt entscheiden, doch noch mehrere Tabellen (Schritt 6) dazuzunehmen: Bestehendes <i>projektname.entity<\/i> entfernen und ein neues anlegen.<\/p>\n<h3>8) Mit der Hibernate Query Language vertraut machen<\/h3>\n<p>Rechtsklick auf das Hibernate Configfile (<i>hibernate.cfg.xml<\/i> oder wie auch immer) und &#8222;Run HQL Query&#8220;. Hier k\u00f6nnen nach Herzenslust Datenbankabfragen probiert werden. Versuchts mal mit <\/p>\n<pre data-enlighter-language=\"sql\" class=\"EnlighterJSRAW\">\r\nfrom Tabellenname\r\n<\/pre>\n<p>Dabei wichtig: <b>Tabellenname<\/b> unbedingt mit gro\u00dfem Erstbuchstabe, auch wenn die Tabelle eigentlich kleingeschrieben ist. Zum Abschicken der Query auf den gr\u00fcnen Pfeil klicken. Sollte euch die Query um die Ohren fliegen (viel roter Text -> Exceptions), sollte gepr\u00fcft werden ob die Datenbank noch korrekt verbunden ist. Also: <i>Services -> jdbc:mysql:\/\/localhost:3306\/datenbank<\/i> und dann Rechtsklick auf den Datenbankname mit &#8222;Set as Default Catalog&#8220; (vergleiche Bild unten).\n<\/p>\n<p><div id=\"attachment_177\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/5-dbauswahl.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-177\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/5-dbauswahl-300x234.png\" alt=\"Datenbankauswahl\" title=\"Datenbankauswahl\" width=\"300\" height=\"234\" class=\"size-medium wp-image-177\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/5-dbauswahl-300x234.png 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/5-dbauswahl.png 366w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-177\" class=\"wp-caption-text\">Datenbankauswahl<\/p><\/div><br \/>\nWer HQL n\u00e4her kennenlernen m\u00f6chte, darf sich <a href=\"http:\/\/docs.jboss.org\/hibernate\/core\/3.3\/reference\/en\/html\/queryhql.html\">hier<\/a> umsehen.<\/p>\n<h3>9) Ausprobieren!<\/h3>\n<p>Genug der grauen Theorie, jetzt gehts an den Code.<\/p>\n<pre data-enlighter-language=\"java\" class=\"EnlighterJSRAW\">\r\npackage db1;\r\n\r\nimport java.util.List;\r\nimport org.hibernate.*;\r\nimport db1.util.HibernateUtil;\r\nimport db1.entity.*;\r\n<\/pre>\n<p>Nat\u00fcrlich entsprechend eures Projektnames anzupassen.<\/p>\n<pre data-enlighter-language=\"java\" class=\"EnlighterJSRAW\">\r\n        try\r\n        {\r\n            Session session = HibernateUtil.getSessionFactory().openSession();\r\n            session.beginTransaction();\r\n            List result = session.createQuery(&quot;from Pizzas&quot;).list();\r\n            session.getTransaction().commit();\r\n\r\n            for(Object o : result)\r\n            {\r\n                Pizzas p = (Pizzas)o;\r\n                System.out.println(p.getPizzaname() + &quot; f\u00fcr &quot; + p.getPrice() + &quot;\u20ac&quot;);\r\n            }\r\n\r\n            session = HibernateUtil.getSessionFactory().openSession();\r\n            session.beginTransaction();\r\n            Pizzas saveP = new Pizzas();\r\n            saveP.setPizzaname(&quot;Chef&quot;);\r\n            saveP.setPrice(10.43);\r\n            session.save(saveP);\r\n            session.getTransaction().commit();\r\n        }\r\n        catch (Exception ex)\r\n        {\r\n            ex.printStackTrace();\r\n        }\r\n<\/pre>\n<p>Da brauch ich jetzt nicht mehr viel zu sagen oder? Mit sauberen SQL Transactions werden erst Datens\u00e4tze ausgegeben und dann ein neuer angelegt &#8211; auf feinste ORM Art. Jetzt zum kr\u00f6nenden Abschluss noch ein Screenshot von der ganzen IDE wies bei mir ausschaut.<br \/>\n<div id=\"attachment_178\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/6-complete.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-178\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/6-complete-300x241.png\" alt=\"Endergebnis\" title=\"Endergebnis\" width=\"300\" height=\"241\" class=\"size-medium wp-image-178\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/6-complete-300x241.png 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/6-complete-1024x824.png 1024w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/6-complete.png 1261w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-178\" class=\"wp-caption-text\">Endergebnis<\/p><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nachdem ich mit SQLite das Java-Fass aufgemacht hab, gibts nun noch Hibernate hinterher. Hibernate ist wohl eines der bekanntesten ORM-Frameworks. Ich zeige das ganze anhand von Netbeans, aber auch hier sollte Eclipse nicht weit entfernt sein. Es wird frech davon &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/java-hibernate-tutorial\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,13],"tags":[],"class_list":["post-172","post","type-post","status-publish","format-standard","hentry","category-datenbanken","category-java"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=172"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/172\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}