سؤال

في JPA الكيانات لطيفة المشروح القديم عادي كائنات جافا.ولكن لم أجد طريقة جيدة للتفاعل مع قاعدة البيانات.

في التطبيق الحالي ، التصميم الأساسي هو دائما أن يكون تسلسل القائمة على الهوية كما المفتاح الأساسي لذلك أنا عادة للبحث عن كيانات أخرى من خصائص PK.

و لكل كيان لدي عديمي الجنسية EJB من

@Stateless
public class MyEntApiBean implements MyEntApi {


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

مع طرق الاستعلام بأن بعض الاختلاف

/**
 * @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>();
}

لذلك:

  1. أنا حقا أكره أن هذه الأساليب في EJB لأنه يبدو أنها تنتمي مع الكيانات نفسها ، EJB المحلية واجهات تزعج حماقة من لي.

  2. أنا أكره الازدواجية التي لدي في كل طريقة مع "محاولة ، createQuery, getResultList,الصيد, سجل عودة" (في الغالب نتيجة عدم الإغلاق أو "بيان" أو somesuch في جافا).

هل من أحد لديه اقتراح أفضل طريقة للتفاعل مع الكيانات قاعدة بيانات عناوين واحد أو كلا من القضايا ؟

أنا حاليا أفكر في القيام ببعض قاعدة الأساليب مع الأدوية والتفكير للحصول على بعض العامة الاستعلام طرق للحد من الازدواجية (العدد 2) (سأضع نموذج مراجعة في وقت لاحق).

شكرا أندرس

هل كانت مفيدة؟

المحلول

حاول التماس.على الاستعلام الكائنات القيام بمعظم العمل بالنسبة لك ، وهم قابلة للتمديد بسهولة.أو يمكنك دائما تطبيق نمط مماثل.

في عام التماس يفعل الكثير من الاشياء المفيدة لسد الفجوة بين JPA عرض الأعمال طبقات.لم يكن لديك إلى استخدام JSF على التماس أن تكون مفيدة.

نصائح أخرى

أنت دون داع مطول.لشيء واحد ، getResultList() لا رمي استثناء عندما يتم إرجاع أية صفوف (على الأقل ليس في الكسوف أو Toplink يمكنني أن أتخيل مزود آخر مختلفا).getSingleResult () ، getResultList() لا.أيضا ، يمكنك استخدام منشئ نمط ذلك:

@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();
}

ينبغي أن يكون كافيا للعودة إلى قائمة نتائج إذا كان هناك أي أو قائمة فارغة إذا كان هناك لا شيء.تجدر الإشارة إلى أمرين:

  1. @الباحث("لحالها") هو غير ضروري لكنه يتخلص من لا مناص منه تحذير عند الصب غير قائمة عامة نتيجة getResultList() إلى قائمة عامة;و

  2. ربما يستحق استبدال createQuery() الاتصال مع @NamedQuery على MyEnt (عادة).لشيء واحد ، وهذا من شأنه نشر التحقق من صحة وقت وأشياء أخرى مفيدة.

لها معقول موجزة وكاملة.

إذا كنت تفعل الكثير من النصوص عمليات البحث ، ربما يجب عليك أن تنظر أيضا في بعض الفهرسة إطار مثل البوصلة.
أنا لا أعرف إذا كان يناسب التطبيق الخاص بك ، ولكن إذا كان ذلك يمكن تحسين شفرة التصميم والأداء.

أنا في الواقع باستخدام التماس.و كائن الاستعلام اقتراح يؤدي بي إلى العثور على إسبات معايير الاستعلامات (الاستعلام حسب المثال) وظائف.يبدو أنه قريب جدا من ما كنت أبحث عنه.

ربما في قاعدة الطبقة ، اندفاعة من الأدوية....?

Moin!

هنا هو بلدي نسخة واحدة من النتائج (أنا استخدامها في سطح المكتب JPA التطبيقات مع TopLink الضروريات):

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;
    }
  }
}

و الاستخدام:

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

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

أو:

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

أطيب التحيات ، جوش.

أنا أفضل استخدام الربيع JpaDaoSupport ، مما يساعد على التعامل مع JPA.وخير مثال هو هنا http://github.com/rafalrusin/jpaqb/blob/master/src/test/java/jpaqb/CarDao.java.

وهو فصل جيد من المنطق أن يكون داو فئة (كائن الوصول إلى البيانات) و DTO (نقل البيانات كائن).داو عادة يحتوي على كل ما يلزم من الاستفسارات DTOs هي كيانات مع الحقول.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top