Правильная практика, чтобы проверить таблицу, а затем сохранить / обновить для Hibernate - PullRequest
0 голосов
/ 17 марта 2020

Все приложения, использующие спящий режим, нуждаются в сохранении и обновлении для взаимодействия с базой данных. Для сохранения я проверю существование по некоторым критериям. Если его не существует, я спасу. Для обновления я проверю наличие и определенные критерии, чтобы определить, будет ли обновление или нет. Как лучше проверять и сохранять / обновлять?

В настоящее время я создаю отдельную функцию, которая открывает сеанс и выполняет поиск, чтобы определить его существование. Сеанс открытия / закрытия очень неуклюжий. Я думаю, что должен быть лучший способ сделать это.

public Event searchByDateAddress(Date _date, String _address, boolean _closeSess)
{
    try
    {
        if(!session.isOpen())
        {
            session = HibernateUtil.getSessionFactory().openSession();
        }
        session.beginTransaction();
        Criteria criteria = session.createCriteria(Event.class);
        criteria.add(Restrictions.eq("date", _date));
        criteria.add(Restrictions.eq("address", _address));
        criteria.setFetchMode("organizerProfile", FetchMode.JOIN);
        Event evt = (Event)criteria.uniqueResult();
        if(_closeSess)
        {
            session.close();
        }
        if (evt==null)
        {
            LogUtils.logInfo("The event does not exist: " + _date + " " + _address);
            return null;
        }
        else
        {
            return evt;
        }
    }
    catch(Exception e)
    {
        LogUtils.logInfo(e.toString());
        if(_closeSess)
        {
            session.close();
        }
        return null;
    }
}


public EventDTO insertEvent(Event _event)
{
    try
    {
        Event tmpEvent=new Event();
        //Event not exists
        if((tmpEvent=this.searchByDateAddress(_event.getDate(), _event.getAddress(), true))==null)
        {
            //insert
            if(!session.isOpen())
            {
                session = HibernateUtil.getSessionFactory().openSession();
            }
            Transaction tx=session.beginTransaction();
            long retOid=(Long)session.save(_event);
            session.flush();
            tx.commit();
            session.close();
            _event.setOid(retOid);
            return new EventDTO(_event);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
        session.close();
    }
    return new EventDTO();
}

Спасибо

1 Ответ

0 голосов
/ 17 марта 2020

Что касается обработки сеансов, то лучше всего ее обрабатывать на уровне API, что является предвосхищением перед этим "EventService". Таким образом, вы всегда предполагаете, что сеанс доступен в сервисных методах. Тогда код будет выглядеть более аккуратно, избегая сеанса с запросом гибернации.

Также возможно вообще избежать обработки сеанса, используя атрибут @Transactional в методах, где вы хотите сеанс. Это возможно с помощью Spring. Посмотрите: https://spring.io/guides/gs/managing-transactions/ для получения дополнительной информации.

Для проверки наличия в таблице данных, указанных в предложении where, вы можете использовать count (*). Так что вам не нужно сначала получать все данные.

Посмотрите на этот пример: Собственный запрос в спящем режиме, количество

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...