سؤال

لدي بعض الأسئلة حول التفاعل مع السبات:

  1. هل أستخدم OpenSession أو getCurrentsession (بدون JTA ، الخيط بدلاً من ذلك)؟
  2. كيف يمكنني خلط عمليات الجلسة مع واجهة المستخدم الرسومية البرجية؟ هل جيد لديك شيء مثل الكود التالي في فصل جافابان؟

    public void actionPerformed(ActionEvent event) {
        // session code
    }
    
  3. هل يمكنني إضافة طرق إلى كياناتاتي التي تحتوي على استعلامات HQL أم أن هذه ممارسة سيئة؟ فمثلا:

     // This method is in an entity MyOtherEntity.java class
     public int getDuration(){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        int sum = (Integer) session.createQuery("select sum(e.duration) as duration from MyEntity as e where e.myOtherEntity.id=:id group by e.name").
            .setLong("id", getId());
            .uniqueResult();
        return sum;
     }
    

كيف يمكنني القيام بذلك بطريقة أفضل وأنيقة؟

تحديثتتمثل الممارسة المستخدمة على نطاق واسع في جعل فئة خدمة/DAO لتحقيق تشغيل فئة الكيانات الخاصة بنا. ولكن لماذا هذا جيد؟ لماذا يجب أن أكتب فصلًا لكل كيانات لي لإدارته؟ أين الميزة الحقيقية؟

تحديث 2فئة الخدمة هو نمط DAO؟ ماذا يعني هذا؟مثال مستودع آرثر رونالد غارسيا هل نمط DAO ، هل هذا ما يسمى "طبقة الخدمة"؟

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

المحلول

أذا أردت الاعتماد على واجهة برمجة تطبيقات السبات العادي يمكنك استخدام طبقة خدمة بسبب

  • هو استخدام حالة مدفوعة
  • تحديد حدود المعاملات

حتى تتمكن من إنشاء خدمة حساب ، على سبيل المثال ، مثل

public static path.to.HibernateUtil.getSessionFactory;

public class AccountService {

    public void withdraw(Integer accountNumber, BigDecimal amount) throws Exception {
        /**
          * Here you set up Transaction boundaries
          */
        getSessionFactory().getCurrentSession().beginTransaction();

        // Some actions goes here

        getSessionFactory().getCurrentSession().getTransaction().commit();
    }

}

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

إذا أردت استعلام HQL قابل للصيانة وقابل للقراءة, ، أنصحك بنصيب استفسارات HQL الخاصة بك في ملف XML متعدد الخط وخارجي

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <query name="GIFT_CARDS_WITH_BUYER">
        <![CDATA[
            from 
                GiftCard c
            left join fetch 
                c.buyer
            where
                c.recipientNotificationRequested = 1
       ]]>
    </query>
    <query name="GIFT_CARDS_WITHOUT_NO_RELATIONSHIP">
        <![CDATA[
            from 
                GiftCard
        ]]>
    </query>
</hibernate-mapping>

لذا داخل حدث Swing Gui الخاص بك ، يمكنك الاتصال بطبقة الخدمة الخاصة بك مثل

public void actionPerformed(ActionEvent event) {
    // Some related Swing GUI actions goes here (retrieve User input, validate data and so on...)

    accountService.withdraw(accountNumber, new BigDecimal(amount));
}

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

public class Account {

   public void doSomething(AccountRepository repository) {
       // code goes here
   }

}

ربما تريد أن ترى هذه خيط

أنصحك بإلقاء نظرة على ثبات جافا مع كتاب السبات ، الفصل 9 (العمل مع الأشياء). ATT: اقرأ بعناية

تحديث

لماذا جيد لديك طبقة خدمة؟

أولا قبل كل شيء

  • يتم استخدام حالة استخدامها (يرسم ما يجب أن يفعله تطبيقك)

الثاني من كل

  • يحدد حدود المعاملات

افترض أن هنا يذهب طبقة خدمتك

public class MyService {

    public void doSomething() {
        getSessionFactory().beginTransaction();

        // A POJO doing some operation

        // Other POJO doing other operation

        // Another POJO doing another operation

        getSessionFactory().getTransaction().commit();
    }

}

لاحظ أنك فقط تحدد حدود معاملة واحدة بدلاً من تحديد كل واحد داخل كل pojo. وأكثر من ذلك ، ما الذي يحدث ما إذا كانت قاعدة عملك داخل واجهة المستخدم الرسومية التي يجب استخدامها داخل مكون آخر. هل ستستخدم Ctrl-C + Ctrl-V ؟؟؟

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