Java ist auch eine Insel

Mittwoch, Mai 03, 2006

Meine FAQ: Existierende DB, Hibernate, EJB 3, HibernateEntityManager

Ich habe eine sehr große DB (Microsoft SQL Server) mit vielen Tabellen und Einträgen. Ich möchte eigentlich Hibernate einsetzen, ist eine grosse schon vorhandene DB da ein Problem? Die DB hat wirklich viele Tabellen und Einträge, meinst Du mit normalen SQL das wäre da besser?

das einfachste ist, mit dem Hibernate-Tools (http://www.hibernate.org/255.html) aus den Relationen automatisch Beans zu generieren. In den aktuellen Versionen erzeugen die Tools auch ganz ordentlich EJB Entity Beans mit den passenden Annotationen für Spaltentyp, Assoziationen, usw. Das generierte Bean-Geflecht sollte man im nächsten Schritt überarbeiten und so anpassen, dass es so ist, wie man sich es wirklich vorstellt; konkretisieren von Lazy-Fetch, usw. Eigentlich sollte man das Objekt-Modell ja getrennt vom DB-Modell aufbauen, um ein schönes, tolles, Domänen-Modell zu erhalten. In einem Kundenprojekt habe ich das auch getan. Die Konsequenz ist viel Arbeit beide zusammen zu bringen, denn beides sah total anders aus. Man muss sich bei der Generierung also überlegen, wie viel Wert einem ein vielleicht weniger optimales Design ist. Auf der anderen Seite kann man sehr elegant die Schicht DB -> Hibernate -> generierte Beans nehmen und die Beans als Service sehen, die dann mit einer anderen Schnittstelle vom Client genutzt werden. Mit der Performance sehe ich überhaupt kein Problem. Es kommt eher auf die HQL-Ausdrücke bzw. EQB-QL (welcher Join?) als auf die Zwischenschicht des OR-Mappers selbst an. Hibernate nutzt ein ordentliches Caching und wenn man will, kann man immer noch mit nativem SQL arbeiten. Auch wenn es um EJB-QL versus Hibernate geht würde ich mit dem Entity-Manager beginnen, und wenn seine API etwas nicht abdeckt, spezielles Locking etwa, würde ich mir vom Entity-Manager den Hibernate-Session geben lassen. Eine Möglichkeit ist, den Entity-Manager von EJB 3 auf die Implementierung HibernateEntityManager zu casten und sich dann die Session zu holen:

Session session = ((HibernateEntityManager)entityManager).getCurrentSession();


Eine weitere Möglichkeit ist, sich von JBoss direkt eine Hibernate Session spritzen zu lassen:

private @PersistenceContext Session session;

AddThis Social Bookmark Button