Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> От JPA к Hibernate 
:(
    Опции темы
diablero
Дата 21.5.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



При работе с JPA использовал следующую модель работы с данными:
Код

       EntityTransaction tx = null;
        try {
            tx = entityManager.getTransaction();
            tx.begin();
            
            ...

            tx.commit();
        } catch (Exception e) {
            if (tx != null && tx.isActive()) {
                tx.rollback();
            }
        }

На каждый Entity есть свой менеджер:
Код

public class UserManager implements Manager {
    private EntityManager entityManager;
    public void init() {
        entityManager = Infinite.getInstance().getEntityManager();
    }
    public void persist(User user) {
        entityManager.persist(user);
    }
    public void merge(User user) {
        entityManager.merge(user);
    }
    public void refresh(User user) {
        entityManager.refresh(user);
    }
    public void remove(User user) {
        entityManager.remove(user);
    }
    public void flush() {
        entityManager.flush();
    }
    public void destroy() {
    }
}


Сейчас необходимо тоже самое переложить на Hibernete.
Нашел такой вот класс:
Код

public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    public static final ThreadLocal transaction = new ThreadLocal();
    public static final ThreadLocal session = new ThreadLocal();

    static {
        try {
            sessionFactory = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static Session currentSession() {
        Session s = (Session) session.get();
        // Open a new Session, if this Thread has none yet
        if (s == null) {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }

    public static void closeSession() {
        Session s = (Session) session.get();
        if (s != null)
            s.close();
        session.set(null);
    }
    public static void beginTransaction() {
        Transaction tx = (Transaction) transaction.get();
        try {
            if (tx == null) {
                tx = currentSession().beginTransaction();
                transaction.set(tx);
            }
        } catch (HibernateException e) {
        }
    }
    public static void commitTransaction() {
        Transaction tx = (Transaction) transaction.get();
        try {
            if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
                tx.commit();
            }
            transaction.set(null);
        } catch (HibernateException e) {
            rollbackTransaction();
        }
    }
    public static void rollbackTransaction() {
        Transaction tx = (Transaction) transaction.get();
        try {
            transaction.set(null);
            if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
                tx.rollback();
            }
        } catch (HibernateException e) {
        } finally {
            closeSession();
        }
    }

    public static void evictQueries(String cacheRegion) {
        sessionFactory.evictQueries(cacheRegion);
    }
    public static void evictQueries() {
        sessionFactory.evictQueries();
    }
}

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


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Platon
Дата 21.5.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 10
Всего: 40



А нельзя данные хранить в сессии? Когда визард пройден, в одном месте все эти данные укладываем в базу.
PM MAIL ICQ   Вверх
Kangaroo
Дата 21.5.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Цитата(diablero @  21.5.2008,  12:51 Найти цитируемый пост)
Сейчас необходимо тоже самое переложить на Hibernete.

А зачем, если не секрет? Чем JPA плох?


--------------------
Lost....
PM MAIL MSN   Вверх
diablero
Дата 21.5.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Цитата(Platon @  21.5.2008,  13:03 Найти цитируемый пост)
А нельзя данные хранить в сессии? Когда визард пройден, в одном месте все эти данные укладываем в базу.

Может я вас конечно не понял, но поэтому это геморой жуткий. Например, создали объект, что-то забыли, изменили, еще разок изменили, а если от него зависет еще какой-то объект. Это жуткая муть получиться.



--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
diablero
Дата 21.5.2008, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Цитата(Kangaroo @  21.5.2008,  13:18 Найти цитируемый пост)
А зачем, если не секрет? Чем JPA плох?


Не всякий запрос можно написать.  Особенно когда нужно получить что-то отличное от  Entity.

в итоге я получил:
Код

try {
            HibernateUtil.beginTransaction();

            //...

            HibernateUtil.commitTransaction();
        } catch (Exception err) {
            HibernateUtil.rollbackTransaction();
            logger.error(err.getMessage(), err);
        } finally {
            HibernateUtil.closeSession();    
        }


Все фунциклирует кроме, связных сущностей.
Есть два класса ClientEntry со связью к один ко многим к HitEntry, а он в свою очередь, связан многие к одному.
Вот маппинг:
Код

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="net.eucodes.infinite.sgpsd.data">

    <class name="ClientEntry" table="logentry_clients_table">
        <id name="id" column="client_id">
            <generator class="increment"/>
        </id>
        
        <bag
            name="hintCollection"
            inverse="true"
            order-by="hit_date"
            cascade="all">

            <key column="client_id"/>
            <one-to-many class="HitEntry"/>

        </bag>
    </class>
</hibernate-mapping>

Код

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="net.eucodes.infinite.sgpsd.data">

    <class name="HitEntry" table="logentry_hits_table">
        <id name="id" column="hit_id">
            <generator class="increment"/>
        </id>
        <many-to-one name="clientEntry" class="ClientEntry" column="client_id"/>
    </class>
</hibernate-mapping>


Объект ClientEntry создается в другом классе, помещается в сессию:
Код

ClientEntry entry = new ClientEntry();
request.getSession().setAttribute("clientEntry", entry);
 logEntryManager.persist(entry);


А в сервлете на каждый хит:
Код

clientEntry.getHintCollection().add(hitEntry);
hitEntry.setClientEntry(clientEntry);


Но hitEntry добавляется в базу только один раз. Я не могу понять почему. Когда проект был на JPA все прекрасно работало.
Может чего не так в маппинге? 



Это сообщение отредактировал(а) diablero - 24.5.2008, 21:22


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0667 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.