Ошибка переноса сеанса в lazy-fetch - PullRequest
3 голосов
/ 17 марта 2011

Ошибка: failed to lazily initialize a collection, no session or session was closed.

Многие люди задают почти один и тот же вопрос, но разрешение не так интуитивно понятно.И, я думаю, необходимо опубликовать еще один вопрос, чтобы описать странное сообщение об ошибке:

(я не собираюсь вставлять сюда исходные коды, потому что он слишком длинный.)

DEBUG [main] (AbstractPlatformTransactionManager.java:365) - Creating new transaction with name [com.bee32.plover.orm.feaCat.FeaturePlayer.tcList]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
DEBUG [main] (HibernateTransactionManager.java:493) - Opened new Session [org.hibernate.impl.SessionImpl@19006c9] for Hibernate transaction
DEBUG [main] (HibernateTransactionManager.java:523) - Not preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@19006c9]
DEBUG [main] (HibernateTemplate.java:397) - Found thread-bound Session for HibernateTemplate
Hibernate:    /* criteria query */ select 
    ...

ERROR [main] (LazyInitializationException.java:42) - failed to lazily initialize a collection, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
  at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
    ...
  at java.util.HashSet.<init>(HashSet.java:116)
    ...
  at org.hibernate.loader.Loader.list(Loader.java:2124)
    ...
  at org.springframework.orm.hibernate3.HibernateTemplate$5.doInHibernate(HibernateTemplate.java:590)
  ...

DEBUG [main] (HibernateTemplate.java:422) - Not closing pre-bound Hibernate Session after HibernateTemplate
DEBUG [main] (AbstractPlatformTransactionManager.java:843) - Initiating transaction rollback
DEBUG [main] (HibernateTransactionManager.java:672) - Rolling back Hibernate transaction on Session [org.hibernate.impl.SessionImpl@19006c9]
DEBUG [main] (HibernateTransactionManager.java:734) - Closing Hibernate Session [org.hibernate.impl.SessionImpl@19006c9] after transaction

Как вы видите, когда запускается lazy-fetch, произошла ошибка, там уже есть сеанс с привязкой к потоку, и он еще не закрыт, пока транзакция не будет откатана.почему он сообщает, что no session or session was closed?

РЕДАКТИРОВАТЬ Соответствующий источник:

@Transactional
public void tcList() {
    for (Cat cat : dao.list()) {
        System.out.println("Saved cat: " + cat);
    }
}

Ответы [ 3 ]

2 голосов
/ 18 марта 2011

С потоком связан сеанс, но управляется ли catList этим сеансом или нет? Сеанс мог быть закрыт внутри dao.list () шаблоном гибернации, который заботится о шаблонном коде.

Один из способов решения проблемы - вызов функции list.get (0) .someGetter () внутри функции dao.list () перед возвратом списка. Это заполнит список фактическими значениями и не должно вызывать ленивое исключение инициализации. Если Cat состоит из других объектов, которые инициализируются лениво, вы должны также вызвать для них свойство getter, если хотите использовать эти свойства.

Также попробуйте удалить любую транзакционную аннотацию в методе dao.list (), если таковая имеется. Используйте транзакцию, созданную вызывающей функцией, а не атрибут Propagation_Required. Если вы использовали @Transactional для dao.list (), менеджер транзакций мог бы вызывать транзакцию транзакции .mit () / session.close () при возврате из этой функции, поэтому catList становится отдельной сущностью, в которой все кошки являются все еще прокси.

0 голосов
/ 30 января 2014

Это означает, что вы пытаетесь загрузить / инициализировать коллекцию вне сеанса. Вероятно, вы должны поддерживать сессию живой, пока не завершите свою работу ..... то есть вам нужно управлять ресурсом сеанса с помощью некоторого связующего кода ... ppl предложил бы инициировать отложенную коллекцию в методе set объекта. не имеет смысла использовать ленивую выборку как активную выборку. поддерживая сеанс в живых, пока операция не станет лучшим способом ....

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

Сущность может быть отсоединена от сеанса, и отложенная загрузка коллекции - это просто прокси? Если вы хотите использовать его, вам нужно объединить его в сеанс?

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