質問
私はヴァーディンを学ぼうとしています。サービスレイヤーオブジェクトへの参照がある場合、セッションに保存され、本当にそれを望んでいないため、あらゆる種類のアプリケーション開発を永続的に行う方法を本当に混乱させています。永続的なものは、シリアル化可能ではありません。
私のケースは、春を使用する既に作成されたアプリケーションがあり、Vaadinで新しいUIを作成しているということです。春のものをVaadinアプリケーションに注入することはできますが、セッションに保存されます。任意のヒント?
ちなみに、Vaadinフォーラムにどのように投稿しますか?投稿ボタンや登録方法が見つかりません:)
解決 3
Vaadinの本がこの問題をカバーしているようです。彼らが推奨するソリューションは、StreadLocalを使用してサービスオブジェクトを保存することです。 Threadlocalは、アプリケーションクラスのTransactionStartおよびトランザクションエンドで初期化および破壊されます。
Vaadin Bookのより詳細な指示: http://vaadin.com/book/-/page/advanced.global.html
他のヒント
私の提案:
- コンテナを含むものとして定義します プレゼンテーション データ。プレゼンテーションオブジェクトから永続的なオブジェクトに直接参照を保持しないでください。
- トランザクション内で永続的なデータオブジェクトをロードし、コンテナをバックバックする対応するプレゼンテーションオブジェクトに変換する「負荷」操作を定義します。
- すべてのコンテナを読み取り専用にします(モデルビューコントローラーパターンに従う:コンテナはモデルです)
- 基礎となる永続的なデータが変更されたときに、コンテナをリロードするために必要に応じて通知/トリガーを設定します。
- スケーラビリティのために、怠zyな負荷などを知っているコンテナを設計または使用するため、コンテナ全体を一度に入力しません(注:難しい
TreeTable
- 見る 問題#9516)
これを試しましたか http://vaadin.com/directory#addon/enterprise-app。このアドオンはスプリングと冬眠を使用します。
私はヴァーディンで冬眠を使用します。私のメインアプリケーションクラスには、セッションファクトリメソッドがあります。
public Session getSession() {
Session currentSession = HibernateUtil.getSessionFactory()
.getCurrentSession();
if(!currentSession.getTransaction().isActive()) {
currentSession.beginTransaction();
}
return currentSession;
}
何でも持続する必要があるすべてのクラスは、メインアプリへの参照を使用し、セッションを取得します。
次に、HQLという名前のクエリを使用するサービスレイヤーがあり、そのデータをリストとして返します。
public List<DataClass> getEntriesforDate(Date date, Integer key) {
return mainApp.getSession().getNamedQuery(DataClass.NAMEDQUERY)
.setParameter("key", key).list();
}
保存するために、ORMクラスをテーブルにマッピングしているだけで、そのクラスのインスタンスを入力してから、マージを使用してオブジェクトを保持します。
getSession().merge(o);
Vaadin wikiの詳細な説明は次のとおりです。
Vaadinの持続性データはセッションに保存されていないため、これについて心配する必要はありません。