Warning: Constant ABSPATH already defined in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php on line 28 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 {"id":41,"date":"2008-06-07T14:41:19","date_gmt":"2008-06-07T12:41:19","guid":{"rendered":"http:\/\/www.florian-oeser.de\/?p=41"},"modified":"2008-06-13T02:04:02","modified_gmt":"2008-06-13T00:04:02","slug":"howto-blazedsfds-tomcat-flex-hibernate-mysql","status":"publish","type":"post","link":"http:\/\/www.florian-oeser.de\/2008\/06\/07\/howto-blazedsfds-tomcat-flex-hibernate-mysql\/","title":{"rendered":"HowTo: BlazeDS\/FDS-Tomcat + Flex + Hibernate + MySQL"},"content":{"rendered":"
In diesem HowTo m\u00f6chte ich euch zeigen wie man mit den beiden Servern eine persistente Datenhaltung realisiert. Dabei werden wir mit MySQL\/JDBC<\/em> und die LiveCycle Data Services<\/em> (kurz LCDS) arbeiten. Die LCDS sind in beiden Servern bereits integriert. Wir werden alle Datenkommunikationen per RemoteObject<\/em> betreiben. Ich werde nicht auf Basics eingehen, deshalb ist es empfehlenswert die Testdrive Tutorials<\/em> schon einmal angeschaut und nachvollzogen zu haben. Ich werde auch nicht auf die Installation der beiden Server eingehen. Wie man Am Ende des Tutorials haben wir als Frontend eine minimale Flexanwendung(mxml-Anwendung<\/em>) geschrieben, die \u00fcber Data Access Objects<\/em> (DAO) Daten in die Datenbank schreibt und auch ausliest. F\u00fcr das HowTo verwende ich Teile aus unserem Projekt radioSiTY<\/a>.<\/p>\n Gleich vorweg der Source. Da ich nicht alle Klassen und Config’s zeige k\u00f6nnt ihr so besser mitarbeiten. Dort findet ihr auch den SQL-Dump f\u00fcr unsere kleine Datenbank und m\u00fcsste diese so nicht selbst erstellen \ud83d\ude09<\/p>\n Source (.rar, 271KB)<\/a><\/p>\n In radioSiTY haben wir verschiedene Funktionen mit Hibernate<\/em> und RPC<\/em> umgesetzt. F\u00fcr dieses HowTo modellieren wir die Kommentar- und Streamfunktionen. Das hei\u00dft konkret das wir folgende Funktionen implementieren:<\/p>\n Da zu jedem Kommentar auch ein Benutzer geh\u00f6rt d\u00fcrfen wir nat\u00fcrlich eine User-Tabelle nicht vergessen. Unsere Datenbank sieht also wie folgt aus:<\/p>\n <\/a><\/p>\n Damit ihr das Tutorial m\u00f6glichst schnell nachvollziehen k\u00f6nnt habe ich hier mal den SQL-Dump. Denn braucht ihr nur mit folgenden Befehl in die Datenbank einschleusen:<\/p>\n Die Datenbank muss vorher nat\u00fcrlich angelegt sein. Auch der username muss entsprechend angepasst werden.<\/p>\n Die Entity-Klassen in Java haben schlie\u00dflich folgende Struktur:<\/p>\n <\/a><\/p>\n Wir haben zum einen einen Hibernatehandler<\/em> der Hibernate ansich initialisiert und alle Funktionen h\u00e4lt. Zum Anderen haben wir die Klassen User<\/em>, Comments<\/em> und Stream<\/em>. Diese Klassen stellen das DAO<\/em> dar und haben lediglich Getter- und SetterMethoden<\/em>. Aus Gr\u00fcnden der \u00dcbersichtlichkeit habe ich aber nicht alle Methoden aufgef\u00fchrt.<\/p>\n Hibernate braucht um Arbeiten zu k\u00f6nnen die Verbindungsangaben zur Datenbank. Desweiteren muss Hibernate auch die einzelnen Tabellen und deren Felder kennen. Diese Angaben macht man in sogenannten Mappingfiles<\/em>(DAO<->Tabelle) im XML-Format. Zun\u00e4chst legen wir aber erstmal die Konfigurationsdatei, mit dem Namen hibernate.cfg.xml<\/em>, f\u00fcr Hibernate an:<\/p>\n Die erste property ist die Treiberangabe. In unserem Fall w\u00e4re das MySQL<\/em>. Hier k\u00f6nnte man dann auch andere Treiber, wie etwa f\u00fcr HSQL<\/em>, angeben. Die n\u00e4chsten drei property<\/em> Angaben sind selbsterkl\u00e4rend und ben\u00f6tigen lediglich eine Anpassung an eure Datenbank. Wichtig ist weiterhin das man bei der dialect property<\/em> den MySQLDialect<\/em> w\u00e4hlt. Analog zum Treiber sind auch hier andere Angaben m\u00f6glich. Auf die property show_sql<\/em> komme ich bei der Implementierung des HibernateHandlers<\/em> noch einmal zu sprechen. Sehr wichtig sind ganz unten die mapping resource’s<\/em>. Das sind unsere oben angesprochenen Mappingfiles. Sie enthalten im Namen immer *.hbm<\/em>.<\/p>\n Wobei wir auch schon beim Thema w\u00e4ren: Die Implementierung dieser Files. Aus Gr\u00fcnden der \u00dcbersichtlichkeit poste ich nur die Stream.hbm.xml.:<\/p>\n Wie man sieht steht in jeder Mappingfile die Klasse\/Tabelle die gemappt werden soll. Danach folgen die Angaben zu den einzelnen Spalten. Der type<\/em> ist immer auf die Javadatentypen bezogen und nicht auf die MySQL-Typen<\/em>. Ihr solltet auch immer zweimal schauen ob der Spaltenname mit dem in der Datenbank \u00fcbereinstimmt. Zu guter letzt muss dann noch in einem set<\/em> die Beziehung zu der anderen Tabelle hergestellt werden. Wichtig zu erw\u00e4hnen w\u00e4ren noch die many-to-one<\/em> Relationen in der comments.hbm.xml<\/em>. Diese Angaben sind essentiel da eine Kommentar schlie\u00dflich die Angaben beinhalten, von welchen Benutzer, zu welchen Stream ein Kommentar geschrieben wurde.<\/p>\n Alle *.hbm’s<\/em> und die hibernate.cfg.xml<\/em> kommen direkt unter das \\WEB-INF\\classes<\/em> Verzeichniss.<\/p>\n Ich m\u00f6chte an dieser Stelle noch die Beispielanwendung zu Hibernate<\/a> von Thorsten Horn erw\u00e4hnen. Das ist ebenfalls ein sch\u00f6nes Tutorial und geht genauer auf die Sachen rund um Hibernate ein. Jedoch ohne Flex-Frontend und mit HSQL \ud83d\ude09<\/p>\n Wenn ihr den FDS-Tomcat verwendet k\u00f6nnt ihr getrost zum n\u00e4chsten Kapitel springen. Falls ihr den BlazeDS verwendet m\u00fcssen wir noch ein paar Hibernate *.jar’s kopieren. Dazu m\u00fcsst ihr aber zuerst den sogenannten Hibernate Core<\/a> herunterladen. Das Archiv entpacken und folgenden *.jar’s nach BlazeDS\\tomcat\\webapps\\samples\\WEB-INF\\lib<\/em> kopieren: asm.jar, cglib-2.1.3.jar, checkstyle-all.jar, commos-collections-2.1.1.jar, dom4j-1.6.1.jar, hibernate3.jar, jta.jar und die log4j-1.2.11.jar.<\/p>\n Das wars dann auch schon \ud83d\ude00<\/p>\n So jetzt gehts ans Eingemacht. Zun\u00e4chst die Entity-Klassen<\/em>. Auch hier poste ich nur die Stream.java<\/em>, da die Anderen zu 90% gleich sind.<\/p>\n Ich denke der Source ist leicht verst\u00e4ndlich. Wichtig ist das RemoteObject<\/em>. Denn das gibt an aus welcher Klasse \u00fcberhaupt die Methoden aufgerufen werden sollen. Diese Destination<\/em> muss \u00e4hnlich wie bei bei der web.xml<\/em> in einer Konfigurationsdatei bekannt gegeben werden. Aber dazu komm ich gleich. Weiterhin h\u00e4tte man die XML-Ausgabe bei den Kommentaren auch in ein DataGrid<\/em> lesen k\u00f6nnen.<\/p>\n Da das RemoteObject<\/em> teil der LCDS<\/em> ist muss man bei der Projekterstellung noch ein paar Sachen beachten. So m\u00fcsst ihr unter Server technology <\/em>die J2EE<\/em> angeben. Der Haken bei Use remote object access service<\/em> muss nat\u00fcrlich gesetzt sein. Im n\u00e4chsten Fenster sind auch noch ein paar Einstellungen zu treffen. Hier muss ein Server ausgew\u00e4hlt werden, auf dem die Applikation kompiliert und ausgef\u00fchrt werden soll. Wichtig dabei ist das der Server vor dem validieren gestartet ist. Ich zeige euch die Einstellungen f\u00fcr den BlazeDS und f\u00fcr den FDS-Tomcat:<\/p>\n <\/a><\/p>\n <\/a><\/p>\n Es ist \u00fcbrigens sehr wichtig auf dem Server zu kompilieren, da es ansonsten zu Fehlern kommt das die RemoteObject-Klasse nicht gefunden wird(in userem Fall der HibernateHandler<\/em>). Das \u00e4ussert sich dann in Can’t find Destination<\/em> Fehlern.<\/p>\n Kommen wir zum letzten Schritt. Wir m\u00fcssen die Destination noch angeben. Wenn man mit RemoteObject<\/em> arbeitet findet diese Angabe in der remoting-config.xml<\/em> unter \\WEB-INF\\flex<\/em> statt. Analog zu dem Beispieleintrag f\u00fcgen also folgendes ein:<\/p>\n Jetzt nur noch in Flex das Projekt starten und staunen \ud83d\ude00<\/p>\n Dieses HowTo war recht umfangreich aber ich denke es hat sich gelohnt. Habt ihr alles umgesetzt habt ihr eine gute Basis um eigene Projekt mit Flex und Hibernate zu realisieren. Ich werde bei Gelegenheit die eine oder andere Sache vielleicht noch ein wenig ausf\u00fchrlicher beschreiben. Auch hier noch einmal der Link zum Tutorial von Thorsten Horn<\/a>, da er wie gesagt die Sachen rund um persistente Datenhaltung, Hibernate und Debugging sehr viel genauer beschreibt.<\/p>\n Ich hoffe ich habe nix vergessen oder \u00fcbersehen. Bei Fragen oder Anregungen k\u00f6nnt ihr mir wie immer mailen oder ein Kommentar hinterlassen. In dem Sinne viel Erfolg \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":" Einleitung In diesem HowTo m\u00f6chte ich euch zeigen wie man mit den beiden Servern eine persistente Datenhaltung realisiert. Dabei werden wir mit MySQL\/JDBC und die LiveCycle Data Services (kurz LCDS) arbeiten. Die LCDS sind in beiden Servern bereits integriert. Wir werden alle Datenkommunikationen per RemoteObject betreiben. Ich werde nicht auf Basics eingehen, deshalb ist es […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[9,6],"tags":[],"_links":{"self":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts\/41"}],"collection":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/comments?post=41"}],"version-history":[{"count":0,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts\/41\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/media?parent=41"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/categories?post=41"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/tags?post=41"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}
\n
\ncom.mysql.jdbc.Driverbeide auf einem Linux-System installiert habe ich in diesem HowTo<\/a> bereits gezeigt.<\/p>\nVorbereitungen Datenhaltung<\/h4>\n
\n
\n
mysql.exe -u username -p radiositiy_db1 < db.sql<\/pre>\n<\/blockquote>\n
Vorbereitung zu Hibernate<\/h4>\n
\r\n<?xml version='1.0' encoding='utf-8'?>\r\n<!DOCTYPE hibernate-configuration PUBLIC\r\n"-\/\/Hibernate\/Hibernate Configuration DTD 3.0\/\/EN"\r\n"http:\/\/hibernate.sourceforge.net\/hibernate-configuration-3.0.dtd">\r\n\r\n<hibernate-configuration>\r\n<session-factory>\r\n\r\n<!-- Database connection settings -->\r\n<property name="connection.driver_class">com.mysql.jdbc.Driver<\/property>\r\n<property name="connection.url">jdbc:mysql:\/\/localhost\/radiositiy_db1<\/property>\r\n<property name="connection.username">root<\/property>\r\n<property name="connection.password">root<\/property>\r\n\r\n<!-- JDBC connection pool (use the built-in) -->\r\n<property name="connection.pool_size">1<\/property>\r\n\r\n<!-- SQL dialect -->\r\n<property name="dialect">org.hibernate.dialect.MySQLDialect<\/property>\r\n\r\n<!-- Enable Hibernate's automatic session context management -->\r\n<property name="current_session_context_class">thread<\/property>\r\n\r\n<property name="transaction.factory_class">\r\norg.hibernate.transaction.JDBCTransactionFactory\r\n<\/property>\r\n\r\n<!-- Disable the second-level cache -->\r\n<property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider<\/property> <!-- Echo all executed SQL to stdout -->\r\n\r\n<property name="show_sql">true<\/property>\r\n\r\n<!-- Load the database table mapping file -->\r\n<mapping resource="Product.hbm.xml"\/>\r\n<mapping resource="Stream.hbm.xml"\/>\r\n<mapping resource="User.hbm.xml"\/>\r\n<mapping resource="comments.hbm.xml"\/>\r\n<\/session-factory>\r\n\r\n<\/hibernate-configuration>\r\n<\/pre>\n
\r\n<?xml version="1.0"?>\r\n<!DOCTYPE hibernate-mapping PUBLIC\r\n"-\/\/Hibernate\/Hibernate Mapping DTD 3.0\/\/EN"\r\n"http:\/\/hibernate.sourceforge.net\/hibernate-mapping-3.0.dtd">\r\n<hibernate-mapping>\r\n<class name="flex.radioSiTY.Stream" table="tbl_streams">\r\n<id name="id" column="id" type="integer">\r\n<generator class="native"\/>\r\n<\/id>\r\n<property name="url" column="fld_url" type="string"\/>\r\n<property name="homepage" column="fld_homepage" type="string"\/>\r\n<property name="name" column="fld_name" type="string" \/>\r\n<property name="genreId" column="genre_id" type="integer"\/>\r\n<property name="image" column="fld_image" type="string"\/>\r\n<set name="user" table="tbl_stream_comments" lazy="true" inverse="true" >\r\n<key column="stream_id"\/>\r\n<many-to-many class="flex.radioSiTY.User" column="id"\/>\r\n<\/set>\r\n<\/class>\r\n<\/hibernate-mapping>\r\n<\/pre>\n
Implementierung Backend (Hibernatehandler und DAO’s)<\/h4>\n
\r\npackage flex.radioSiTY;\r\n\r\nimport java.util.*;\r\n\r\npublic class Stream \r\n{\r\n private int id;\r\n private String url;\r\n private String homepage;\r\n private String name;\r\n private int genreId;\r\n private String image;\r\n private Set user = new HashSet();\r\n private Set comments = new HashSet();\r\n \r\n public Stream() { }\r\n \r\n\r\n public int getId() { return id; }\r\n public String getUrl() { return url; }\r\n public String getHomepage() { return homepage; }\r\n public String getName() { return name; }\r\n public int getgenreId() { return genreId; }\r\n public String getImage() { return image; }\r\n public Set getUser() { return user; }\r\n public Set getComments() { return comments; }\r\n\r\n public void setId( int id ) { this.id = id; }\r\n public void setUrl( String url ) { this.url = url; }\r\n public void setHomepage( String homepage ) { this.homepage = homepage; }\r\n public void setName( String name ) { this.name = name; }\r\n public void setgenreId ( int genre ) { this.genreId = genre; }\r\n public void setImage( String image ) { this.image = image; }\r\n public void setUser( Set user ) { this.user = user; }\r\n public void setComments( Set comments ) { this.comments = comments; }\r\n}\r\n\r\n\r\n[\/Sourcecode]\r\n\r\nJetzt unser <em>HibernateHandler<\/em>:\r\n\r\n\/*!\r\n * @brief Hibernate Handler\r\n * \r\n * Der HibernateHandler stellt die Schicht zwischen der Flexanwendung und der Datenbank dar. Hibernate ist ein \r\n * objektorientiertes Persistence Framework. Das hei\u00dft alle Daten liegen als Objekte vor und werden auch so in die Datenbank geschrieben und gelesen.\r\n * Aufgabe des Handlers ist es die Verbindung zur Datenbank herzustellen, eine Session und Transaction aufzubauen.\r\n * \r\n * Wichtig: Hibernate jar's m\u00fcssen dem BuildPath hinzugef\u00fcgt werden!\r\n *\/\r\n\r\npackage flex.radioSiTY;\r\n\r\nimport java.util.*;\r\n\r\nimport org.hibernate.*;\r\nimport org.hibernate.cfg.Configuration;\r\n\r\nimport java.security.MessageDigest;\r\nimport java.sql.SQLException;\r\nimport java.io.IOException;\r\nimport java.io.PrintWriter;\r\nimport java.math.BigInteger;\r\n\r\nimport javax.servlet.ServletException;\r\nimport javax.servlet.http.HttpServletRequest;\r\nimport javax.servlet.http.HttpServletResponse;\r\n\r\npublic class HibernateHandler {\r\n\tpublic SessionFactory sessionFactory = null;\r\n\r\n\t\/\/ public Session sess = null;\r\n\t\/\/ public Transaction trx = null;\r\n\r\n\t\/\/ ! @brief Hibernate wird im Konstruktor initialisiert\r\n\tpublic HibernateHandler() {\r\n\t\t\/*\r\n\t\t * Die Konfiguration f\u00fcr die Datenbankverbindung und das Mapping der\r\n\t\t * einzelnen Tabellen liegt in der 'hibernate.conf'\r\n\t\t *\/\r\n\t\tif (sessionFactory == null) {\r\n\t\t\ttry {\r\n\t\t\t\tSystem.out\r\n\t\t\t\t\t\t.println("------------------------------------------------------");\r\n\t\t\t\tSystem.out.println("Initializing Hibernate");\r\n\t\t\t\tsessionFactory = new Configuration().configure()\r\n\t\t\t\t\t\t.buildSessionFactory();\r\n\t\t\t\tSystem.out.println("Finished Initializing Hibernate");\r\n\t\t\t\tSystem.out\r\n\t\t\t\t\t\t.println("------------------------------------------------------");\r\n\t\t\t} catch (HibernateException ex) {\r\n\t\t\t\tex.printStackTrace();\r\n\t\t\t\tSystem.exit(5);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\t\/*\r\n\t\t * ! Dies sind lediglich Tests die man lokal durchf\u00fchren kann. Der\r\n\t\t * Output erfolgt hier \u00fcber die Console. Die eigentlichen Aufrufe der\r\n\t\t * Mehtoden erfolgt durch Flex \u00fcber RPC. Somit ist die main() eigentlich\r\n\t\t * hinf\u00e4llig und dient lediglich weiteren lokalen Tests.\r\n\t\t *\/\r\n\r\n\t\t HibernateHandler handler = new HibernateHandler();\r\n\t\t\/\/ String test = new String();\r\n\t\t\/\/ handler.showCommentsFromStream(78, false);\r\n\t\t\/\/ Date date = new Date(1922,110,23);\r\n\t\t\/\/ handler.updateUser(25, "Hans Test", "nickname" , "egal",\r\n\t\t\/\/ "test@test.de", date);\r\n\t\t\/\/ handler.addStream("http:\/\/test.de", "http:\/\/test.de", "testStream",\r\n\t\t\/\/ 5, "C:\/test2.image");\r\n\t\t\/\/ egal = handler.showUsers();\r\n\t\t\/\/ egal =handler.showStreams();\r\n\t\t\/\/ handler.showComments();\r\n\t\t\/\/ System.out.println(test);\r\n\t\t\/\/ User user = new User();\r\n\t\t\/\/ Stream stream = new Stream();\r\n\t\t\/\/ user = handler.getUser(25);\r\n\t\t\/\/ stream = handler.getStream(88);\r\n\t\t\/\/ handler.addComments(6, 9, "test4mitch", date, 0);\r\n\t\t\/\/ System.out.println(user.getName() );\r\n\t\t\/\/ System.out.println(stream.getName());\r\n\t\t\r\n\t\t \/\/LCDS\r\n\t\t \/*List testListe = new ArrayList(handler.getStreams());\r\n\t\t for(int i = 0; i< testListe.size(); i++) System.out.println((Stream)testListe.get(i));*\/\r\n\t\t \r\n\t\t \/*Stream testStream = new Stream(handler.getStream(16));\t\t\r\n\t\t testStream.setName("test me");\t\t\r\n\t\t handler.update(testStream);*\/\r\n\t\t \r\n\t}\r\n\r\n\t\r\n\t\/*\r\n\t * ! @brief Diese Methode f\u00fcgt eine Stream in die DB ein. Verwendet wird sie\r\n\t * wenn ein Benutzer einen Stream hinzuf\u00fcgt.\r\n\t *\/\r\n\tpublic void addStream(String url, String homepage, String name,\r\n\t\t\tint genreId, String image) {\r\n\t\tSession sess = null;\r\n\t\tTransaction trx = null;\r\n\t\ttry {\r\n\t\t\tsess = sessionFactory.openSession();\r\n\t\t\ttrx = sess.beginTransaction();\r\n\t\t\tStream stream = new Stream();\r\n\t\t\t\/\/ stream.setId(id); wird automatisch inkrementiert\r\n\t\t\tstream.setUrl(url);\r\n\t\t\tstream.setHomepage(homepage);\r\n\t\t\tstream.setName(name);\r\n\t\t\tstream.setgenreId(genreId);\r\n\t\t\tstream.setImage(image);\r\n\r\n\t\t\tsess.save(stream);\r\n\t\t\ttrx.commit();\r\n\t\t} catch (HibernateException ex) {\r\n\t\t\tif (trx != null)\r\n\t\t\t\ttry {\r\n\t\t\t\t\ttrx.rollback();\r\n\t\t\t\t} catch (HibernateException exRb) {\r\n\t\t\t\t}\r\n\t\t\tthrow new RuntimeException(ex.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (sess != null)\r\n\t\t\t\t\tsess.close();\r\n\t\t\t} catch (Exception exCl) {\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t\/*\r\n\t * ! @brief Diese Methode f\u00fcgt ein Kommentar in die DB ein. Verwendet wird\r\n\t * sie wenn ein Benutzer ein Kommentar hinzuf\u00fcgt.\r\n\t *\/\r\n\tpublic void addComment(int userId, int streamId, String text, int blocked) {\r\n\t\tSystem.out.println("\\n\\nInit add!\\n");\r\n\r\n\t\tDate date = new Date();\r\n\r\n\t\tSystem.out.println("Comment in DB speichern!!!!!\\n");\r\n\t\tSession sess = null;\r\n\t\tTransaction trx = null;\r\n\r\n\t\ttry {\r\n\t\t\tsess = sessionFactory.openSession();\r\n\t\t\ttrx = sess.beginTransaction();\r\n\t\t\tComments comment = new Comments();\r\n\t\t\t\/\/ comment.setId(id); wird automatisch inkrementiert\r\n\t\t\tcomment.setText(text);\r\n\t\t\tSystem.out.println(text + "\\n");\r\n\t\t\tcomment.setBlocked(blocked);\r\n\t\t\tSystem.out.println(blocked + "\\n");\r\n\t\t\tcomment.setDate(date);\r\n\t\t\tSystem.out.println(date + "\\n");\r\n\t\t\tcomment.setUser(getUser(userId));\r\n\t\t\tcomment.setStream(getStream(streamId));\r\n\r\n\t\t\tsess.save(comment);\r\n\t\t\tSystem.out.println("Now added!\\n\\n");\r\n\t\t\ttrx.commit();\r\n\t\t} catch (HibernateException ex) {\r\n\t\t\tif (trx != null)\r\n\t\t\t\ttry {\r\n\t\t\t\t\ttrx.rollback();\r\n\t\t\t\t} catch (HibernateException exRb) {\r\n\t\t\t\t}\r\n\t\t\tthrow new RuntimeException(ex.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (sess != null)\r\n\t\t\t\t\tsess.close();\r\n\t\t\t} catch (Exception exCl) {\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t\/*\r\n\t * ! @brief Die Methode gibt ein Userobjekt nach ID zur\u00fcck.\r\n\t * \r\n\t * Wird von addComment() verwendet @param userId ID des Benutzers @return\r\n\t * User-Objekt\r\n\t *\/\r\n\tpublic User getUser(int userId) {\r\n\t\tSession sess = null;\r\n\t\tTransaction trx = null;\r\n\r\n\t\tUser user = new User();\r\n\r\n\t\ttry {\r\n\t\t\tsess = sessionFactory.openSession();\r\n\t\t\ttrx = sess.beginTransaction();\r\n\t\t\tSystem.out.println("\\nUser zu Id:" + userId);\r\n\r\n\t\t\tString hql = new String(\r\n\t\t\t\t\t"select user from User as user where user.id = :userId");\r\n\t\t\tQuery query = sess.createQuery(hql);\r\n\t\t\tquery.setInteger("userId", userId);\r\n\t\t\tIterator itr = query.iterate();\r\n\t\t\twhile (itr.hasNext()) {\r\n\t\t\t\tuser = (User) itr.next();\r\n\t\t\t}\r\n\t\t\ttrx.commit();\r\n\t\t} catch (HibernateException ex) {\r\n\t\t\tif (trx != null)\r\n\t\t\t\ttry {\r\n\t\t\t\t\ttrx.rollback();\r\n\t\t\t\t} catch (HibernateException exRb) {\r\n\t\t\t\t}\r\n\t\t\tthrow new RuntimeException(ex.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (sess != null)\r\n\t\t\t\t\tsess.close();\r\n\t\t\t} catch (Exception exCl) {\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn user;\r\n\t}\r\n\r\n\t\/*\r\n\t * ! @brief Die Methode gibt ein Streamobjekt nach ID zur\u00fcck. Wird von\r\n\t * addComment() verwendet @param streamId ID des Streams @return\r\n\t * Stream-Objekt\r\n\t *\/\r\n\tpublic Stream getStream(int streamId) {\r\n\t\tSession sess = null;\r\n\t\tTransaction trx = null;\r\n\t\tStream stream = new Stream();\r\n\r\n\t\ttry {\r\n\t\t\tsess = sessionFactory.openSession();\r\n\t\t\ttrx = sess.beginTransaction();\r\n\t\t\tSystem.out.println("\\nStream zu Id:" + streamId);\r\n\r\n\t\t\tString hql = new String(\r\n\t\t\t\t\t"select stream from Stream as stream where stream.id = :streamId");\r\n\t\t\tQuery query = sess.createQuery(hql);\r\n\t\t\tquery.setInteger("streamId", streamId);\r\n\t\t\tIterator itr = query.iterate();\r\n\t\t\twhile (itr.hasNext()) {\r\n\t\t\t\tstream = (Stream) itr.next();\r\n\t\t\t}\r\n\t\t\ttrx.commit();\r\n\t\t} catch (HibernateException ex) {\r\n\t\t\tif (trx != null)\r\n\t\t\t\ttry {\r\n\t\t\t\t\ttrx.rollback();\r\n\t\t\t\t} catch (HibernateException exRb) {\r\n\t\t\t\t}\r\n\t\t\tthrow new RuntimeException(ex.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (sess != null)\r\n\t\t\t\t\tsess.close();\r\n\t\t\t} catch (Exception exCl) {\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn stream;\r\n\t}\r\n\r\n\t\/*\r\n\t * ! @brief Diese Methode gibt die verf\u00fcgbaren Kommentare aus.\r\n\t * \r\n\t * Wahlweise nach User oder Stream @param id Angabe des Streams oder des\r\n\t * Users @param searchUser Angabe ob nach Kommentaren eines Users(true) oder\r\n\t * nach Kommentaren zu einem Stream gesucht wird @return Gibt das Ergebniss\r\n\t * als XML-String zur\u00fcck\r\n\t *\/\r\n\tpublic String showComments(int id, boolean searchUser) {\r\n\t\tSession sess = null;\r\n\t\tTransaction trx = null;\r\n\t\tStringBuffer output = new StringBuffer();\r\n\r\n\t\ttry {\r\n\t\t\tsess = sessionFactory.openSession();\r\n\t\t\ttrx = sess.beginTransaction();\r\n\t\t\tString hql = new String();\r\n\t\t\tif (!searchUser) {\r\n\t\t\t\thql = "select comment from Comments as comment where comment.stream = :id order by date asc";\r\n\t\t\t} else {\r\n\t\t\t\thql = "select comment from Comments as comment where comment.user = :id";\r\n\t\t\t}\r\n\r\n\t\t\tQuery query = sess.createQuery(hql);\r\n\t\t\tquery.setInteger("id", id);\r\n\t\t\tIterator itr = query.iterate();\r\n\r\n\t\t\tSystem.out.println("\\n\\nComments als XML ausgeben!!!!!\\n\\n");\r\n\r\n\t\t\toutput.append("<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>");\r\n\t\t\toutput.append("<comments>");\r\n\r\n\t\t\twhile (itr.hasNext()) {\r\n\t\t\t\tComments comment = (Comments) itr.next();\r\n\t\t\t\toutput.append("<comment>");\r\n\t\t\t\toutput.append("\\t<text>" + comment.getText() + "<\/text>");\r\n\t\t\t\toutput.append("\\t<user>" + comment.getUser().getUsername()\r\n\t\t\t\t\t\t+ "<\/user>");\r\n\t\t\t\toutput.append("\\t<date>" + comment.getDate().toString()\r\n\t\t\t\t\t\t+ "<\/date>");\r\n\t\t\t\toutput.append("<\/comment>");\r\n\t\t\t}\r\n\r\n\t\t\toutput.append("<\/comments>");\r\n\t\t\ttrx.commit();\r\n\t\t} catch (HibernateException ex) {\r\n\t\t\tif (trx != null)\r\n\t\t\t\ttry {\r\n\t\t\t\t\ttrx.rollback();\r\n\t\t\t\t} catch (HibernateException exRb) {\r\n\t\t\t\t}\r\n\t\t\tthrow new RuntimeException(ex.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (sess != null)\r\n\t\t\t\t\tsess.close();\r\n\t\t\t} catch (Exception exCl) {\r\n\t\t\t}\r\n\t\t}\r\n\t\tString string = new String(output);\r\n\r\n\t\t\/\/ HttpServletResponse response;\r\n\t\t\/\/ response.setContentType("text\/html");\r\n\r\n\t\treturn string;\r\n\t}\r\n\r\n\t\/\/ ! @brief Diese Methode gibt alle Kommentare als String zur\u00fcck\r\n\tpublic String showComments() {\r\n\t\tSession sess = null;\r\n\t\tTransaction trx = null;\r\n\r\n\t\tStringBuffer output = new StringBuffer();\r\n\r\n\t\ttry {\r\n\t\t\tsess = sessionFactory.openSession();\r\n\t\t\ttrx = sess.beginTransaction();\r\n\t\t\tSystem.out.println("\\nAlle Kommentare:");\r\n\t\t\tList comments = sess.createQuery("from Comments").list();\r\n\t\t\tfor (int i = 0; i < comments.size(); i++) {\r\n\t\t\t\tComments comment = (Comments) comments.get(i);\r\n\r\n\t\t\t\toutput.append("Commment: " + comment.getText());\r\n\t\t\t\tSystem.out.println("Commment: " + comment.getText()\r\n\t\t\t\t\t\t+ "\\nvon User: " + comment.getUser().getUsername()\r\n\t\t\t\t\t\t+ "\\nStreamname:" + comment.getStream().getName());\r\n\r\n\t\t\t}\r\n\t\t\ttrx.commit();\r\n\t\t} catch (HibernateException ex) {\r\n\t\t\tif (trx != null)\r\n\t\t\t\ttry {\r\n\t\t\t\t\ttrx.rollback();\r\n\t\t\t\t} catch (HibernateException exRb) {\r\n\t\t\t\t}\r\n\t\t\tthrow new RuntimeException(ex.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (sess != null)\r\n\t\t\t\t\tsess.close();\r\n\t\t\t} catch (Exception exCl) {\r\n\t\t\t}\r\n\t\t}\r\n\t\tString string = new String(output);\r\n\t\treturn string;\r\n\t}\r\n\r\n\t\/\/ ! @brief Diese Methode gibt alle Streams als String zur\u00fcck\r\n\tpublic String showStreams() {\r\n\t\tSession sess = null;\r\n\t\tTransaction trx = null;\r\n\r\n\t\tStringBuffer output = new StringBuffer();\r\n\r\n\t\ttry {\r\n\t\t\tsess = sessionFactory.openSession();\r\n\t\t\ttrx = sess.beginTransaction();\r\n\t\t\tSystem.out.println("\\nStreams:");\r\n\t\t\tList streams = sess.createQuery("from Stream").list();\r\n\t\t\tfor (int i = 0; i < streams.size(); i++) {\r\n\t\t\t\tStream stream = (Stream) streams.get(i);\r\n\r\n\t\t\t\toutput.append("Streams: " + stream.getName());\r\n\t\t\t\tSystem.out.println("GenreId: " + stream.getgenreId()\r\n\t\t\t\t\t\t+ "\\nName: " + stream.getName() + "\\nHomepage: "\r\n\t\t\t\t\t\t+ stream.getHomepage() + "\\nUrl: " + stream.getUrl()\r\n\t\t\t\t\t\t+ "\\nImage: " + stream.getImage());\r\n\t\t\t}\r\n\r\n\t\t\ttrx.commit();\r\n\t\t} catch (HibernateException ex) {\r\n\t\t\tif (trx != null)\r\n\t\t\t\ttry {\r\n\t\t\t\t\ttrx.rollback();\r\n\t\t\t\t} catch (HibernateException exRb) {\r\n\t\t\t\t}\r\n\t\t\tthrow new RuntimeException(ex.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (sess != null)\r\n\t\t\t\t\tsess.close();\r\n\t\t\t} catch (Exception exCl) {\r\n\t\t\t}\r\n\t\t}\r\n\t\tString string = new String(output);\r\n\t\treturn string;\r\n\t}\r\n\r\n\t\/\/ ! @brief Diese Methode gibt alle User als String zur\u00fcck\r\n\tpublic String showUsers() {\r\n\t\tSession sess = null;\r\n\t\tTransaction trx = null;\r\n\r\n\t\tStringBuffer output = new StringBuffer();\r\n\r\n\t\ttry {\r\n\t\t\tsess = sessionFactory.openSession();\r\n\t\t\ttrx = sess.beginTransaction();\r\n\t\t\tList users = sess.createQuery("from User").list();\r\n\t\t\tfor (int i = 0; i < users.size(); i++) {\r\n\t\t\t\tUser user = (User) users.get(i);\r\n\r\n\t\t\t\toutput.append("User : " + user.getName());\r\n\t\t\t\tSystem.out.println("Name: " + user.getName() + " Username: "\r\n\t\t\t\t\t\t+ user.getUsername() + " Alter: " + user.getBirthday());\r\n\r\n\t\t\t}\r\n\t\t\ttrx.commit();\r\n\t\t} catch (HibernateException ex) {\r\n\t\t\tif (trx != null)\r\n\t\t\t\ttry {\r\n\t\t\t\t\ttrx.rollback();\r\n\t\t\t\t} catch (HibernateException exRb) {\r\n\t\t\t\t}\r\n\t\t\tthrow new RuntimeException(ex.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (sess != null)\r\n\t\t\t\t\tsess.close();\r\n\t\t\t} catch (Exception exCl) {\r\n\t\t\t}\r\n\t\t}\r\n\t\tString string = new String(output);\r\n\t\treturn string;\r\n\t}\r\n\t\r\n\t\r\n}\r\n[\/sourcecode]\r\nOkay ersmal eine Menge Source. Wie versprochen sind alle Methoden die wir brauchen aufgef\u00fchrt. Es sind aber noch zwei weitere hinzugekommen. N\u00e4mlich <em>getUser()<\/em> und <em>getStream()<\/em>, die f\u00fcr die Funktion <em>addComment()<\/em>, die dann den jeweiligen User und Stream zur\u00fcckgeben. Wie ihr seht geben unsere Funktionen bis auf <em>showStreams()<\/em> immer XML-Strings zur\u00fcck. Das hat den Grund das wir in <em>radioSiTY<\/em> diese Strings in ein DataGrid schreiben werden ;-)\r\n\r\nIm Source findet ihr \u00fcbrigens noch die Funktion <em>updateUser()<\/em>. Dort seht ihr wie man mit Hibernate eine Tabelle updatet.\r\n\r\nErw\u00e4hnenswert w\u00e4re noch die main(). Dort seht ihr die auskommentierten Funktionsaufrufe. Das waren unsere Testmethoden bevor wir \u00fcberhaupt an das Frontend gegangen sind. Man kann n\u00e4mlich diese Anwendung auch als Konsolenanwendung starten. Dazu m\u00fcsst ich nur wieder in die einzelnen Funktionen die Ausgabe \u00fcber <em>System.out.println()<\/em> gestalten ansatt einen String zur\u00fcckzugeben (siehe <em>showStreams()<\/em>). Ich errinner mich gerade das ich ja nochmal auf den SQL-Output aus der Hibernate-Konfigurationsdatei zu sprechen kommen wollte. Dadurch das wir den Wert auf <em>true<\/em> gesetzt hatten, sehen wir jetzt die SQL Ausgabe in der Konsole. Das betrifft dann auch die Ausgaben auf der Konsole von BlazeDS\/FDS-Tomcat. Sehr n\u00fctzlich ;-)\r\n\r\nIm \u00dcbrigen seht ihr, dass alle Querys in <em>HQL <\/em>geschrieben sind. Das ist die <em>Hibernate Query Language<\/em> und muss benutzt werden. Es ist also kein normales <em>SQL<\/em> m\u00f6glich. Es ist \u00fcbrigens sehr wichtig das ihr alle <em>Hibernate *.jar's<\/em> zu dem <em>Java Build Path<\/em> hinzuf\u00fcgt, da sich ansonsten das Projekt nicht kompilieren l\u00e4sst.\r\n\r\nJetzt legt ihr unter dem Ordner <em>\\WEB-INF\\classes\\flex<\/em> das Verzeichniss radioSiTY an. Dort hinein kopiert ihr die kompilierten <em>DAO-Klassen<\/em> und den <em>HibernateHandler<\/em>.\r\n<h4>Implementierung Frontend (mxml-Applikation)<\/h4>\r\nSo wir kommen langsam aber sicher zum Ende. Nun ist es nicht mehr viel. Wir schreiben eine ganz kleine Anwendung du die unsere Funktionen nutzt. Nur die <em>addStream()<\/em> nicht, da diese analog zu <em>addComment()<\/em> l\u00e4uft. Aber das seht ihr dann eh selbst im Source.\r\n\r\n<a href="http:\/\/www.florian-oeser.de\/wordpress\/wp-content\/2008\/06\/hibernate_mxml.jpg"><img class="aligncenter size-medium wp-image-47" title="hibernate_mxml" src="http:\/\/www.florian-oeser.de\/wordpress\/wp-content\/2008\/06\/hibernate_mxml-300x128.jpg" alt="hibernate_mxml" width="300" height="128" \/><\/a>\r\n\r\n<?xml version="1.0" encoding="utf-8"?>\r\n<mx:Application xmlns:mx="http:\/\/www.adobe.com\/2006\/mxml" layout="absolute">\r\n<mx:Script>\r\n<![CDATA[\r\n\r\nprivate function checkComments():void {\r\n\r\nremoteObject.showComments(78,false);\r\n}\r\n\r\nprivate function addComments() :void {\r\n\r\nremoteObject.addComment(userId.text,streamId.text,text.text,blocked.text);\r\nremoteObject.showComments(streamId.text,false);\r\n\r\n}\r\n\r\n]]>\r\n<\/mx:Script>\r\n<mx:RemoteObject id="remoteObject" destination="product"\/>\r\n\r\n<mx:Button x="115" y="58" label="Get Comments" id="getComments" click="checkComments()"\/>\r\n<mx:Button x="587" y="58" label="Get Streams" id="getStreams" click="remoteObject.showStreams()"\/>\r\n<mx:TextInput x="70" y="345" width="37" id="streamId"\/>\r\n<mx:TextInput x="169" y="345" width="31" id="userId"\/>\r\n<mx:TextInput x="282" y="345" width="246" id="text"\/>\r\n<mx:TextInput x="599" y="345" width="59" id="blocked"\/>\r\n<mx:Button x="684" y="345" label="add Comment" id="addComment" click="addComments()"\/>\r\n<mx:TextArea x="483" y="109" width="330" height="196" id="txt_getStreams" text="{remoteObject.showStreams.lastResult}" \/>\r\n<mx:TextArea x="52" y="109" id="txt_getComments" text="{remoteObject.showComments.lastResult}" width="311" height="196"\/>\r\n<mx:Label x="10" y="347" text="streamId:"\/>\r\n<mx:Label x="115" y="347" text="userId:"\/>\r\n<mx:Label x="239" y="347" text="text:"\/>\r\n<mx:Label x="537" y="347" text="blocked?"\/>\r\n\r\n<\/mx:Application>\r\n\r\n<\/pre>\n
\r\n<destination id="product">\r\n<properties>\r\n<source>flex.radioSiTY.HibernateHandler<\/source>\r\n<\/properties>\r\n<\/destination>\r\n<\/pre>\n
Conclusion<\/h4>\n