Как я могу смешать гибернацию и качаться в хорошем смысле

StackOverflow https://stackoverflow.com/questions/3065634

Вопрос

У меня есть несколько вопросов о взаимодействии с Hibernate:

  1. Нужно ли я использовать ждетельность или getcurrentsion (без jta, нить)?
  2. Как я могу смешивать операции сеанса с помощью PARK GUI? Хорошо, есть что-то вроде следующего кода в классе Javabean?

    public void actionPerformed(ActionEvent event) {
        // session code
    }
    
  3. Могу ли я добавить методы в моих объектов, которые содержат QQL-запросы или это плохая практика? Например:

     // 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 класс для достижения операции CRUD наших организаций класса. Но почему это хорошо? Почему я должен написать класс для каждого моих сущностей, чтобы управлять этим? Где реальное преимущество?

Обновление 2.Сервисный класс - это шаблон дао? Что это значит?Пример репозитория Артура Рональда ФД Гарсия Это шаблон DAO, это то, что называется «сервисный слой»?

Это было полезно?

Решение

Если вы хотите полагаться на простой гибернации API Вы можете использовать сервисный слой, потому что

  • Это использует ведомый случай
  • Диллимитные границы транзакции

Таким образом, вы можете создать учетную систему, например, как

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>

Таким образом, внутри вашего события GUI Swing вы можете позвонить в ваш сервисный слой, как

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
   }

}

Может быть, вы хотите увидеть это Нить

Я совет, вы посмотрите на устойчивость Java с помощью Hibernate Book, глава 9 (работа с объектами). Атаку: читай внимательно

ОБНОВИТЬ

Почему хороши есть сервисный слой?

Прежде всего

  • Это используйте ведомое количество (он рисует то, что должно сделать ваше приложение)

На втором месте

  • Он разграничивает границы транзакции

Предположим, здесь идет ваш сервисный слой

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. И еще, что происходит, нужно ли ваше деловое правило внутри вашего колебания GUI для использования внутри другого компонента. Будете ли вы использовать Ctrl-C + Ctrl-V ???

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top