Frage

In JPA sind die Entitäten schön kommentierten Plain Old Java Objects. Aber ich habe nicht eine gute Möglichkeit, um mit ihnen interagieren und der Datenbank.

gefunden

In meinem aktuellen app, meine grundlegende Design ist immer eine Sequenz basiert id als Primärschlüssel haben, so muss ich in der Regel Einheiten durch andere Eigenschaften als PK nachzuschlagen.

Und für jede Entity Ich habe eine stateless EJB von

@Stateless
public class MyEntApiBean implements MyEntApi {


@PersistenceContext(unitName = "xxx") @Inject EntityManager entityManager;

mit Abfragemethoden, die alle eine gewisse Variation sind

/**
 * @return A List of all MyEnts that have some property
 * @param someProp some property
 */
public List<MyEnt> getAllMyEntsFromProp(final String someProp) {

    try {
        final Query query = entityManager.createQuery("select me from MyEnt me where me.someProp = :someProp");
        query.setParameter("someProp", someProp);
        return query.getResultList();
    } catch(final NoResultException nre) {
        log.warn("No MyEnts found");
    }
    return new ArrayList<MyEnt>();
}

So:

  1. Ich hasse wirklich diese Methoden in einem EJB haben, weil sie mit den Entitäten zu gehören scheinen sich, und die lokale EJB-Schnittstellen verärgern den Mist aus mir.

  2. Ich hasse die Vervielfältigung, die ich mit in jedem Verfahren habe „versuchen, Create, getResultList, zu fangen, sich einzuloggen, return“ (meist eine Folge ohne Verschlüsse oder „mit Aussage“, etc. zu jagen in Java).

Hat jemand einen Vorschlag für eine bessere Art und Weise mit den Entitäten und Datenbank zu interagieren, die einen oder beide meiner Fragen behandelt werden?

Ich bin derzeit denke einige Basismethoden mit Generika und Reflexion zu tun, einige allgemeinen Abfragemethoden zu erhalten, die Vervielfältigung (Ausgabe 2) zu reduzieren (Ich werde einen Prototyp später zur Überprüfung setzen).

Danke, Anders

War es hilfreich?

Lösung

Versuchen Sie Seam. Die Query-Objekte die meisten tun die Arbeit für Sie, und sie sind leicht erweiterbar. Oder man kann immer ein ähnliches Muster implementieren.

In der Regel tut Seam vielen nützlichen Sachen, die Lücke zwischen der PPV zu überbrücken und der Anzeige und Business-Schichten. Sie haben keine JSF haben für Naht zu verwenden, nützlich zu sein.

Andere Tipps

Sie sind unnötig ausführlich. Für eine Sache, getResultList () nicht eine Ausnahme auslösen, wenn keine Zeilen zurückgegeben werden (zumindest nicht in Eclipse oder Toplink - ich einen anderen Anbieter nicht vorstellen kann anders sein). getSingleResult () der Fall ist, getResultList () nicht. Sie können aber auch den Erbauer verwenden so:

@SuppressWarnings("unchecked")
public List<MyEnt> getAllMyEntsFromProp(final String someProp) {
  return entityManager.createQuery("select me from MyEnt me where me.someProp = :someProp")
    .setParameter("someProp", someProp);
    .getResultList();
}

sollte ausreichend sein, um eine Liste der Ergebnisse zurück, wenn es eine oder eine leere Liste ist, wenn es keine gibt. Zwei Dinge zu beachten:

  1. @SuppressWarnings ( „ungeprüft“) ist nicht erforderlich, aber es wird eine sonst unvermeidliche Warnung befreien, wenn die nicht-generische List resultiert aus getResultList () auf eine generische Liste Gießen; und

  2. Es ist wahrscheinlich lohnt sich, die Create () mit einem @NamedQuery auf MyEnt (in der Regel) zu ersetzen. Zum einen wird diese deploy Zeitvalidierung und andere nützliche Dinge ermöglichen.

Die einigermaßen präzise und vollständig sind.

Wenn Sie eine Menge von Textsuch tun, sollten Sie vielleicht auch einige Indizierung Rahmen betrachten wie Compass .
Ich weiß nicht, ob es für Ihre Anwendung eignet, aber wenn so kann es sowohl Code-Design und Leistung verbessern.

Ich verwende eigentlich Seam. Und die Abfrage Objekt Vorschlag mich führen auf finden überwintert Kriterien Abfragen (Query By Example) Funktionalität . Das scheint sehr nahe, was ich suchte.

Vielleicht in einer Basisklasse und mit einem Schuss Generika ....?

Moin!

Hier ist meine Version für Einzelergebnisse (ich benutze es in meinen Desktop JPA-Anwendungen mit TopLink Essentials):

public class JPA {
  @SuppressWarnings ("unchecked")
  public static <T> T querySingle(
      EntityManager em, 
      Class<T> clazz, 
      String namedQuery, 
      Pair... params) 
  {
    Query q = em.createNamedQuery(namedQuery);
    for (Pair pair : params) {
      q.setParameter(pair.key, pair.value);      
    }
    List<T> result = q.getResultList();
    if ( result.size() == 0 ) {
      return null;
    }
    if ( result.size() == 1 ) {
      return result.get(0);
    }
    throw new 
      IllegalStateException(
        "To many result rows for query: " 
         + namedQuery 
         + " where " 
         + Arrays.toString(params));
  }

  public static class Pair {
    String key;
    Object value;

    public static Pair param (String key, Object value) {
      return new Pair (key, value);
    }

    public Pair (String key, Object value) {
      this.key = key;
      this.value = value;
    }

    @Override
    public String toString() {
      return key + "=" + value;
    }
  }
}

Und die Nutzung:

import static org.sepix.JPA.*;
...

String id = ...
Customer customer = querySingle (em, Customer.class, 
                      "Customer.findByID", Pair.param ("id", id));

oder:

String inquiryID = ...
Boolean current = Boolean.TRUE;
Inquiry inq = querySingle (em, Inquiry.class, 
                      "Inquiry.findCurrent", 
                      Pair.param ("inquiry", inquiryID),
                      Pair.param ("current", current));

Mit freundlichen Grüßen,   josh.

Ich ziehe mit Spring JpaDaoSupport, die mit PPV behandeln hilft. Ein gutes Beispiel ist hier http: // Github .com / rafalrusin / jpaqb / Blob / Master / src / test / java / jpaqb / CarDao.java .

Eine gute Trennung von Logik ist eine DAO-Klasse (Data Access Object) und DTO (Data Transfer Object) zu haben. DAO enthält typischerweise alle erforderlichen Abfragen und DTOs Einheiten sind mit Feldern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top