Надлежащий способ автосоединить Быть в спящем режиме Сессию проводом в тесте Spring Transaction JUnit

На основе кода Theran, но расширения его к методам на классах:



class Dynamo(object):
    pass

def add_dynamo(cls,i):
    def innerdynamo(self):
        print "in dynamo %d" % i
    innerdynamo.__doc__ = "docstring for dynamo%d" % i
    innerdynamo.__name__ = "dynamo%d" % i
    setattr(cls,innerdynamo.__name__,innerdynamo)

for i in range(2):
    add_dynamo(Dynamo, i)

d=Dynamo()
d.dynamo0()
d.dynamo1()


, Который должен распечатать:


in dynamo 0
in dynamo 1

11
задан Community 23 May 2017 в 12:26
поделиться

2 ответа

SessionFactoryUtils.getSession () так же хорошо как и любой другой способ получить Session. Он делает то же самое, что и HibernateDaoSupport.getSession ().

Причина, по которой вам нужен scoped-proxy, - это время. Без прокси с областью действия кажется, что он вводит сеанс до начала теста и, следовательно, до начала транзакции, поэтому вы получаете ошибки.

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

6
ответ дан 3 December 2019 в 10:04
поделиться

Я думаю, что «правильный» способ - это внедрение SessionFactory и программная выборка сеанса из него. Причина, по которой вы получаете исключение, заключается в документированном поведении SessionFactoryUtils.getSession () :

Получить сеанс гибернации для данного SessionFactory. Знает и будет вернуть любые существующие соответствующие Сессия привязана к текущему потоку, например при использовании HibernateTransactionManager. Будет в противном случае создайте новый сеанс, если "allowCreate" истинно.

Поскольку ничто не связывало сеанс с текущей транзакцией, он терпит неудачу.

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

hibernateTemplate.get(User.class, "me@here.com");
4
ответ дан 3 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

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