私はサービスを持っており、ドメインオブジェクトを作成してそれを保存しようとしています。
それはセーブ一部になったとき、私はサービスの内部のドメインオブジェクトを保存するために何をする必要がありますどのようなエラーGrails - ドメインオブジェクトをサービス内に保存するには?
No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
を取得します。インターネット上のすべてが、これは単に動作するはずのように見えます....
編集:
詳細: 私はこの記事全体で同様のシナリオである
Hibernate session in threads
をつまずきました。私のサービスはサードパーティの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がhistoricalDataを何度も呼び出しています。上記のコードでは、それが最初のレコードを保存しているが、その後、第二の記録に私はエラーを取得しています:
Could not open Hibernate Session; nested exception is org.hibernate.SessionException: Session is closed!
編集:
ので、この上に読んでより多くの私が何であるかを理解すると思いますハプニング。
通常、コントローラから呼び出されると、休止状態のセッションがサービスに注入されます。
historyDataはコントローラ経由ではなくサードパーティのアプリケーションから呼び出されているため、セッションが閉じられていると告げるので、休止状態のセッションはサービスに注入されません。
サービスがコントローラから呼び出されていない場合、Grailsドメインモデルオブジェクト(つまりHistoricalContractData)を保存するために、新しいハイバーネーションセッションを作成するにはどうすればよいのでしょうか?
上記のように、NewSessionは機能していません。私はそういう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オブジェクトを保存するために、セッションオブジェクトを使用する方法を理解していません。
あなたはサービス範囲を意味していますか?私のサービスはシングルトンです。いくつかの例や文書を私に教えてもらえますか?ありがとう –
あなたは "このように"私は元々は私のサービスを作成するためにチュートリアルに従ったが、ドキュメントはこのトピックではまばらなように意味するものについてより具体的にするのに役立ちますか? –
あなたのコードをすべて見ることなく、より具体的にすることはできません。率直に言って、私は時間を費やしたいとは思っていません。私は今夜出かける! – duffymo