Hallo,
ich beschäftige mich gerade mit Hibernate und dem DAO konzept aber so ganz komme ich nicht dahinter, bzw sind viele Frage offen, auf die ich keine Antworten finde.
Overhead:
Wie vermeide ich overhead, möchte ich z.B. nicht alle Felder eines Datensatzes haben?
Sagen wir mal die Tabelle Product enthält id, name und description, wobei name der Name des Produktes ist und desctiption eine detailierte beschreibung zu diesem Produkt.
In meiner Anwendung, sagen wir mal ein Dialog, möchte ich nun eine Liste mit allen Produktnamen darstellen. Erst wenn der Anwender auf ein Produkt klickt, öffnet sich ein neues Fenster und die Beschreibung wird angezeigt.
Eleganterweise würde ich in etwa so meine Daten laden
List<Product> products = productDAO.findAll(Product.class);
nun kann ich darüber iterieren und bekomme mit product.getName() den Namen.
So weit so gut. Dummerweise wurden alle Daten aus der Datenbank geladen, auch wenn ich sie nicht benötige, auch description.
ich würde von daher mein DAO so erweitern, dass ich nur die Namen bekommen würde, die geht mit HQL und da bin ich schon an einer Stelle wo ich sage, wo ist hier der Vorteil zu SQL (aus Entwicklersicht, ich möchte ja weniger Code schreiben und mich eigentlich mit statements nicht auseinander setzen)
Query q = session.createQuery("p.name from Product");
List<Object[]> result = query.list();
Hier bekomme ich dann auch nur ein Object[] mit den Daten zurück, um wieder mein Product POJO zu füllen müsste ich mir erst ein neue Objekt erstellen und dann befüllen, oder ich habe den passenden Konstruktor (da die POJOs allerdings automatisch generiert wurden und werden wenn sich die DB Struktur ändern möchte ich in den POJOs nicht rumfummeln)
idealerweise wäre das dann so in etwa:
Query q = session.createQuery("new Product(p.name) from Product");
List<Product> result = query.list();
for(Product p : resulr) p.getName(); ...
aber wie gesagt, dann müsste es den passenden Konstuktor geben.
Die Tatsächlichen Tabellen sind natürlich weit aus komplexer teilweise mit mehreren Fremdschlüsseln.
Die frage ist: ist der Ansatz richtig? Habe ich das richtig verstanden, oder werfe ich was durcheinander. Gibt es gute Tutorials (und ich meine nicht die wo ein User erzeugt wird und in die Datenbank geschrieben wird, sondern komplexere Sachen)/Lektüre dazu. Ich nutze Hibernate 4.3.0 sie sollte daher recht aktuell sein.
Was mir mal aufgefallen ist, dass selbst die ofizielle Hibernate Doku veraltet zu sein scheint. nutzt man die samples trifft man öfters auf deprecated methoden. Kommen die nicht hinterher, oder wollen die, dass man support kauft?
Danke
ich beschäftige mich gerade mit Hibernate und dem DAO konzept aber so ganz komme ich nicht dahinter, bzw sind viele Frage offen, auf die ich keine Antworten finde.
Overhead:
Wie vermeide ich overhead, möchte ich z.B. nicht alle Felder eines Datensatzes haben?
Sagen wir mal die Tabelle Product enthält id, name und description, wobei name der Name des Produktes ist und desctiption eine detailierte beschreibung zu diesem Produkt.
In meiner Anwendung, sagen wir mal ein Dialog, möchte ich nun eine Liste mit allen Produktnamen darstellen. Erst wenn der Anwender auf ein Produkt klickt, öffnet sich ein neues Fenster und die Beschreibung wird angezeigt.
Eleganterweise würde ich in etwa so meine Daten laden
List<Product> products = productDAO.findAll(Product.class);
nun kann ich darüber iterieren und bekomme mit product.getName() den Namen.
So weit so gut. Dummerweise wurden alle Daten aus der Datenbank geladen, auch wenn ich sie nicht benötige, auch description.
ich würde von daher mein DAO so erweitern, dass ich nur die Namen bekommen würde, die geht mit HQL und da bin ich schon an einer Stelle wo ich sage, wo ist hier der Vorteil zu SQL (aus Entwicklersicht, ich möchte ja weniger Code schreiben und mich eigentlich mit statements nicht auseinander setzen)
Query q = session.createQuery("p.name from Product");
List<Object[]> result = query.list();
Hier bekomme ich dann auch nur ein Object[] mit den Daten zurück, um wieder mein Product POJO zu füllen müsste ich mir erst ein neue Objekt erstellen und dann befüllen, oder ich habe den passenden Konstruktor (da die POJOs allerdings automatisch generiert wurden und werden wenn sich die DB Struktur ändern möchte ich in den POJOs nicht rumfummeln)
idealerweise wäre das dann so in etwa:
Query q = session.createQuery("new Product(p.name) from Product");
List<Product> result = query.list();
for(Product p : resulr) p.getName(); ...
aber wie gesagt, dann müsste es den passenden Konstuktor geben.
Die Tatsächlichen Tabellen sind natürlich weit aus komplexer teilweise mit mehreren Fremdschlüsseln.
Die frage ist: ist der Ansatz richtig? Habe ich das richtig verstanden, oder werfe ich was durcheinander. Gibt es gute Tutorials (und ich meine nicht die wo ein User erzeugt wird und in die Datenbank geschrieben wird, sondern komplexere Sachen)/Lektüre dazu. Ich nutze Hibernate 4.3.0 sie sollte daher recht aktuell sein.
Was mir mal aufgefallen ist, dass selbst die ofizielle Hibernate Doku veraltet zu sein scheint. nutzt man die samples trifft man öfters auf deprecated methoden. Kommen die nicht hinterher, oder wollen die, dass man support kauft?
Danke
Zuletzt bearbeitet: