Почему аргумент Session
в o.h.type.CollectionType.getElementIterator
не используется?
Короткий ответ: он не обязателен, это просто проблема обратной совместимости с 8 лет назад.
Длинный ответ - система типов, используемая для фактического отклонения некоторого поведения на основе того, задал ли пользователь сеанс для работы в EntityMode.MAP
или EntityMode.POJO
и, следовательно, типы, необходимые для того, чтобы знать, в каком режимесеанс был в;следовательно, почему это было передано.
Но даже в 2011 году, когда это было изменено, аргумент сеанса влиял только на поведение тогда и только тогда, когда сеанс работал в EntityMode.MAP
.Другими словами, все другие режимы всегда перенаправляются непосредственно в базовый метод коллекций * 1016.
Однако все это, кроме этого, никак не влияет на то, что вы испытываете в своем Debug3 .снимок экрана.
Это ошибка в Hibernate?
Нет, основываясь на том, что я прочитал, я полагаю, вы смешиваете проблемы.
В Hibernate (без Envers) вы в основном можете сделать это
// Request 1
request1EntityManager = getEntityManager();
sessionScopeEntity = request1EntityManager.find( MyEntity.class, myEntityId );
// Request 2
request2EntityManager = getEntityManager();
sessionScopeEntity = request2EntityManager.merge( sessionScopeEntity );
for ( SomeCollectionItem Item : sessionScopeEntity.getSomeCollection() ) {
// do things here
}
Вышеописанное работает, потому что вы заново связываете сущность с новым сеансом, который, в свою очередь, внедряет сеанс во все неинициализированные прокси, поддерживаемые сущностью,Но вы также можете переписать вышеприведенное как:
// Request 1
request1EntityManager = getEntityManager();
sessionScopeEntity = request1EntityManager.find( MyEntity.class, myEntityId );
sessionScopeEntity.getSomeCollection().size() // initialize collection w/request1Session
// Request 2
request2EntityManager = getEntityManager();
for ( SomeCollectionItem Item : sessionScopeEntity.getSomeCollection() ) {
// do things here
}
Разница в том, что коллекция инициализируется с первым сеансом, и, следовательно, когда вы пытаетесь получить к ней доступ во втором сеансе, сущность не обязательно нуждается в слиянии.поскольку коллекция больше не является прокси-сервером, а фактически заполняется, как обычная извлеченная коллекция.
Основное различие между экземпляром сущности, возвращаемым Hibernate, и экземпляром проверяемого объекта, возвращаемым Envers, заключается в том, что проверяемый объектЭкземпляр сущности НЕ является управляемой персистентной сущностью.
В зависимости от вашего сценария, вы можете решить проверять только подмножество полей в сопоставлении сущностей.Вот почему вы не можете и не должны использовать такие вещи, как merge
с этим экземпляром, поскольку это может легко привести к непреднамеренным побочным эффектам с вашими реальными данными.
Если вы намереваетесь передавать проверенный экземпляр сущности через сеансы, яНастоятельно рекомендуется вместо этого инициализировать необходимые коллекции заранее с первым сеансом, в который вы извлекли экземпляр, потому что в настоящее время нет способа повторно связать проверенный экземпляр сущности с новым сеансом.