У меня есть служба, и внутри одной из функций я создаю объект домена и пытаюсь его сохранить.
когда он доходит до части сохранения, я получаю сообщение об ошибке
Сессия Hibernate не привязана к потоку, и конфигурация не позволяет создавать здесь нетранзакционную сессию.
Что мне нужно сделать, чтобы сохранить объект домена внутри службы. все в интернете делает вид, что это должно просто работать....
Изменить:
дополнительные сведения: я наткнулся на этот пост
Спящий сеанс в тредах
что аналогичный сценарий. Мой сервис вызывается сторонним API.
Изменить:
Я не очень хорошо это объясняю. Вот более полный код
import org.springframework.beans.factory.InitializingBean
import com.ib.client.EWrapper;
class BrokerService implements InitializingBean, EWrapper{
static transactional = true
private EClientSocket m_client
private boolean m_disconnectInProgress = false
void afterPropertiesSet(){
// this.setting = grailsApplication1.config.setting
m_client = new EClientSocket(this)
m_disconnectInProgress = false
connect()
}
def boolean connect() {
m_client.eConnect()
if (m_client.isConnected())
return true
return false
}
def void historicalData(int reqId, String date, double open,
double high, double low, double close, int volume, int count,
double WAP, boolean hasGaps)
{
HistoricalContractData.withNewSession{session->
println ' just before object create'
def hcd = new sbi.investments.HistoricalContractData()
hcd.hc_id = reqId
hcd.data_date = new Date().parse('yyyyMMdd', date.replace('finished-', ''))
hcd.open = open
hcd.high = high
hcd.low = low
hcd.close = close
hcd.volume =volume
hcd.trade_count =count
hcd.wap = WAP
hcd.has_gaps = hasGaps.toString()
println ' just before save'
hcd.save()
if(hcd.hasErrors()){
println '=========== ERROR! ============'
println hcd.errors
}
}
}
}
сторонний API несколько раз вызывает historyData. С приведенным выше кодом он сохраняет первую запись, но затем во второй записи я получаю сообщение об ошибке:
Не удалось открыть сеанс гибернации; вложенным исключением является org.hibernate.SessionException: сеанс закрыт!
Редактировать:
поэтому, читая об этом больше, я думаю, что понимаю, что происходит.
сеанс гибернации обычно внедряется в Службу при вызове из контроллера.
Поскольку historyData является при вызове из стороннего приложения, а не через контроллер, сеанс гибернации не внедряется в службу, поэтому он жалуется, что сеанс закрыт.
Поэтому я думаю, что реальный вопрос может заключаться в том, что если служба не вызывается из контроллера, как мне создать новый сеанс гибернации, чтобы сохранить объект модели предметной области Grails (т.е. HistoricalContractData).
Как видно выше, withNewSession не работает. Должен ли я использовать SessionFactory таким образом?
(не могу опубликовать ссылку на источник, потому что переполнение стека не нравится)
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class YourService {
SessionFactory sessionFactory // set by Dependency Injection
public void yourMethod() {
Session session = sessionFactory.getCurrentSession();
// do something with session
}
}
Я пробовал это, но не понимаю, как использовать объект сеанса, чтобы сохранить объект HistoricalContractData.