В Spring с jpa/hibernate, как я сохраняю сессию открытой для предотвращения ленивых исключений инициализации?

Вы можете использовать CSS, чтобы создать линию другого цвета, пример будет такой:

border-left: 1px solid rgb(216, 216, 216);
border-right: medium none;
border-width: medium medium medium 2px;
border-style: none none none solid;
border-color: -moz-use-text-color -moz-use-text-color -moz-use-text-color rgb(216, 216, 216);

этот код будет отображать вертикальную серую линию.

19
задан HappyEngineer 16 July 2009 в 20:09
поделиться

6 ответов

https://www.hibernate.org/43.html

В принципе, у вас есть несколько вариантов.

-Вы можете использовать шаблон «открытый сеанс в представлении», в котором вы используете логику в стиле фильтра / перехватчика / АОП, чтобы открывать сеанс, когда логика на стороне сервера начинается, и закрывать его, когда он завершается.

-Вы можете реализовать диалоги, охватывающие несколько циклов запрос-ответ.

Простой старый фильтр сервлетов - самый простой.

9
ответ дан 30 November 2019 в 04:59
поделиться

Вы используете Spring HibernateTemplate? Я верю, что это поможет вам провести сеанс. В качестве альтернативы, если вы используете Hibernate 3.0.1 или новее, Spring все равно сможет управлять сеансом за вас.

В блоге SpringSource есть запись , в которой описывается, как это настроить. Ниже приведен отрывок:

Начиная с Hibernate 3.0. 1 (и в Java Persistence API с момента его первого выпуска) для Spring стало возможным управлять базовым ресурсом без необходимости проходить какие-либо шаблоны, доступные для этих технологий. Это означает, что даже если вы используете Hibernate API напрямую (например, через SessionFactory.getCurrentSession ()), вы все равно будете использовать сеанс Hibernate, управляемый Spring. То же самое относится к EntityManager, полученному через JPA EntityManagerFactory. Это еще одна причина, по которой вам больше не нужно использовать Spring HibernateTemplate, чтобы получить интегрированный опыт. getCurrentSession ()), вы по-прежнему будете использовать сеанс Hibernate, управляемый Spring. То же самое относится к EntityManager, полученному через JPA EntityManagerFactory. Это еще одна причина, по которой вам больше не нужно использовать Spring HibernateTemplate, чтобы получить интегрированный опыт. getCurrentSession ()), вы по-прежнему будете использовать сеанс Hibernate, управляемый Spring. То же самое и для EntityManager, полученного через JPA EntityManagerFactory. Это еще одна причина, по которой вам больше не нужно использовать Spring HibernateTemplate, чтобы получить интегрированный опыт. [...]

Ниже приводится XML, который мы будем использовать для сборки приложения. Как вы можете видеть, мы, конечно, все еще используем способ Spring для настройки Hibernate (используя LocalSessionFactoryBean).

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <!– the works –>
</bean>
<bean id="accountRepo" class="com.mycompany.HibernateAccountRepository">
  <constructor-arg ref="sessionFactory"/>
</bean>

Теперь, как я уже сказал, из-за небольшого изменения в Hibernate 3.0.1 Spring может управлять сеансом Hibernate за вас, без необходимости проходить сеанс Hibernate. Единственное, чего не хватало, так это перевода исключения. Чтобы добиться этого, вам нужно только аннотировать репозиторий с помощью аннотации @Repository (предоставленной Spring) и включить преобразование исключений с помощью постпроцессора.

@Repository // from org.springframework.stereotype
public class HibernateAccountRepository implements AccountRepository {
    // see above for full impl…
}
1
ответ дан 30 November 2019 в 04:59
поделиться

Как говорили другие, вам следует прочитать о шаблоне «открытый сеанс в поле зрения», основная идея которого состоит в том, чтобы сеанс гибернации был открыт на протяжении всей обработки HTTP-запроса. Существуют решения как для спящего режима , так и spring - я использовал ранее Spring, и он отлично работает.

В вопросе вы упоминаете, что не хотите, чтобы транзакция открывалась для много времени. Для большинства людей это не проблема, потому что каждый запрос обрабатывается относительно быстро. Однако, если в вашем случае это действительно невозможно, этот шаблон вам не подойдет. Не могли бы вы объяснить, почему вы не хотите, чтобы транзакции оставались открытыми?

3
ответ дан 30 November 2019 в 04:59
поделиться

Я не использовал Spring, но я использовал Hibernate в нескольких разных проектах. Подход, который я выбрал для самого последнего проекта, вырос из шаблона Defensive Session Handling (в сочетании с фильтром сервлетов), и мы им довольны. Вы можете найти больше шаблонов проектирования здесь .

0
ответ дан 30 November 2019 в 04:59
поделиться

Последний вариант, который, кажется, упущен, - это вы можете построить свой граф объектов на основе вашего варианта использования, используя JOIN.

Это приведет к инициализации объекта, то есть он не будет прокси.

Используйте этот подход, если вы контролируете клиента (т. Е. Не создаете открытую службу, публикующую api), потому что вам нужно знать, какое состояние происходит при закрытии сеанса из-за закрытия транзакции.

5
ответ дан 30 November 2019 в 04:59
поделиться

Когда вы оставляете открытый сеанс, который считал некоторые данные, вы оставляете эту транзакцию открытой. Длительные транзакции - не такая уж большая проблема (хотя это может зависеть от вашей базы данных), что действительно вызывает проблемы, так это блокировки, удерживаемые в течение длительного времени, но они могут быть созданы только после того, как вы действительно измените данные в базе данных. Опять же, это зависит от вашей базы данных.

0
ответ дан 30 November 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: