-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: Eleganz, EJB3, EntityManager und der Verlust von Criteria
PostPosted: Mon Jul 11, 2005 11:56 am 
Beginner
Beginner

Joined: Tue Mar 15, 2005 2:36 am
Posts: 32
Location: Bonn, Germany
Hallo!

In Anlehnung an dieses Thema DAO und unter Verwendung der brandaktuellen Hibernate Version 3.1alpha habe ich eine Frage bezüglich EJB3, EntityManager und der EJB-QueryLanguage.

Geht das eleganter und ohne Stringkonkatenation? Ich meine die queryByProperty() Methode in der folgenden Klasse.

Code:
public abstract class AbstractDAO<E> {

  protected final Class<E> entityClass;

  protected final String entityClassName;

  protected AbstractDAO(Class<E> entityClass) {
    this.entityClass = entityClass;
    this.entityClassName = entityClass.getName();
  }

  public E queryByProperty(String property, Object value) {
    EntityManager manager = EjbManager.get();
    Query query = manager.createQuery("select e from " + entityClassName + " e where e." + property + " = :value");
    query.setParameter("value", value);
    return (E) query.getSingleResult();
  }

}


Ein konkreter Anwendungsfall sieht so aus:

Code:
public class UserDAO extends AbstractDAO<User> {

  public UserDAO() {
    super(User.class);
  }

  public static User forName(String name) {
    return new UserDAO().queryByProperty("name", name);
  }

}


Klar - man könnte den Querystring teilweise im Konstruktor zusammenbauen und in der Methode eine StringBuilder verwenden. Aber ich vermisse die Klarheit der Hibernate Criteria Klasse. Hier ein Schnippsel, der natürlich nur mit einer Hibernate Session funktioniert und damit wieder nicht EJB3-generisch sondern Hibernate-abhängig ist:

Code:
Session session = ...
Criteria criteria = session.createCriteria(entityClass);
criteria.add(Property.forName("name").eq(name));
...


Oder bedingt die Designentscheidung für EJB3 dass man nicht mehr alle Extra-Hibernate-Features mehr nutzen kann? Gibt es einen Weg, der einem zumindest die Query-Geschichte erleichtert?

Oder macht es gar keinen Sinn, solche Abfrage in typisierte DAOs unterzubringen?

Grüße und bis dann,
Christian


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jul 11, 2005 12:09 pm 
Beginner
Beginner

Joined: Tue Mar 15, 2005 2:36 am
Posts: 32
Location: Bonn, Germany
Ein verwandtes Thema: http://forum.hibernate.org/viewtopic.php?t=941669


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jul 11, 2005 12:48 pm 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
Es macht keinen Sinn ein _standardisiertes_ Criteria API mit der ersten Version von EJB 3.0 zu erwarten, wo man gerade geschafft hat die ganzen Hersteller einigermassen auf Linie zu bekommen. Die Loesung ist die Erweiterungen eines jeden Herstellers zu verwenden, diese wird man auf alle Faelle fuer Performance-Tuning sowieso brauchen. Fuer Hibernate geht das mit ( (HibernateEntityManager) em).getSession().createCriteria();


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jul 11, 2005 1:01 pm 
Beginner
Beginner

Joined: Tue Mar 15, 2005 2:36 am
Posts: 32
Location: Bonn, Germany
christian wrote:
Es macht keinen Sinn ein _standardisiertes_ Criteria API mit der ersten Version von EJB 3.0 zu erwarten, wo man gerade geschafft hat die ganzen Hersteller einigermassen auf Linie zu bekommen.


Sinn macht es schon :p ... es ist nur reichlich unverschämt. Aber klar, eins nach dem anderen. Insgesamt finde ich die (das?) EJB3 API schon recht weit gediehen und stelle eben gerade unsere Testcode auf den EnitiyManager um. Dabei bleibt einiges auf der Strecke - und das ist in manchen Fällen auch gut so. (-:

christian wrote:
Die Loesung ist die Erweiterungen eines jeden Herstellers zu verwenden, diese wird man auf alle Faelle fuer Performance-Tuning sowieso brauchen. Fuer Hibernate geht das mit ( (HibernateEntityManager) em).getSession().createCriteria();


Hach, da ist ja die altbekannte Session wieder. Schön! (-:

Danke und ich freue mich auf EJB4,
Christian


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.