На основе кода 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
SessionFactoryUtils.getSession () так же хорошо как и любой другой способ получить Session. Он делает то же самое, что и HibernateDaoSupport.getSession ().
Причина, по которой вам нужен scoped-proxy, - это время. Без прокси с областью действия кажется, что он вводит сеанс до начала теста и, следовательно, до начала транзакции, поэтому вы получаете ошибки.
Добавляя прокси с областью действия, он проксирует сеанс и внедряет его, поэтому он не вводить фактический сеанс заранее (до начала транзакции), но только извлекает его и выполняет вызовы после запуска теста, когда ему действительно нужно сделать вызов против него.
Я думаю, что «правильный» способ - это внедрение SessionFactory
и программная выборка сеанса из него. Причина, по которой вы получаете исключение, заключается в документированном поведении SessionFactoryUtils.getSession ()
:
Получить сеанс гибернации для данного SessionFactory. Знает и будет вернуть любые существующие соответствующие Сессия привязана к текущему потоку, например при использовании HibernateTransactionManager. Будет в противном случае создайте новый сеанс, если "allowCreate" истинно.
Поскольку ничто не связывало сеанс с текущей транзакцией, он терпит неудачу.
Я предлагаю использовать HibernateTemplate
- определите его в своем контексте и автоматически подключите его к ваш тест. HibernateTemplate
выполняет большинство тех же операций, что и военный сеанс, но выполняет бит обработки сеанса за вас. Вы должны просто уметь делать:
hibernateTemplate.get(User.class, "me@here.com");