0

私はT5、Java 1.7について話しています。

Tapestry サービス内での休止状態の使用に関する十分に詳細なチュートリアルが見つかりません。必要なのは、休止状態を個別に処理できるタペストリー サービスを作成することです。これは、たとえば、スケジューラ サービスである可能性があります。このサービスは、DB 内のいくつかのオブジェクトとその状態を処理し、アプリケーションのバックグラウンドで動作します。

問題は、Hibernate とどのように正しくバインドするかです。このサービス内でさらに作業を行うために、Hibernate のどのオブジェクトを注入する必要がありますか?


現在のアプローチは、このサービス内にHibernateSessionSourceオブジェクトを注入し (サービスのコンストラクターを介してそのインスタンスを渡す)、手動でセッションを作成し、トランザクションを開始するなどです。例えば:

public synchronized void deleteJob(long id) {
    Session session = hss.create();
    JobItem job = (JobItem) session.get(JobItem.class, id);
    if (job != null) {
        Transaction tx = session.beginTransaction();
        try {
            session.delete(job);
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
        } finally {
            session.close();
        }
    }
}

タペストリーのスタイルではなく、非常に醜く見えます。賢いアプローチとは?

4

3 に答える 3

2

非タペストリー管理サービスを扱っている場合は、HibernateSessionManagerを使用できます。

try {
   do_stuff(hibernateSessionManager.getSession());
   hibernateSessionManager.commit();
}catch(Exception ex){
   hibernateSessionManager.abort();
}

タペストリーのマネージド サービスとページ/コンポーネントについては、詳細なドキュメントを参照してください。ここにいくつかのリンクがあります

  1. http://tapestry.apache.org/using-tapestry-with-hibernate.html
  2. http://tapestry.apache.org/hibernate-user-guide.html
于 2013-03-21T15:01:37.873 に答える
2

この質問は 2 つの部分で構成されています。

タペストリーマネージドサービス内で休止状態を使用するには?

@Injectアノテーションを使用して、サービスに hibernate セッションを挿入できます。

@Inject
private Session session;

またはコンストラクターパラメーターとして:

public MyService buildMyService(Session session) {
  return new MyAwsomeService(session);
}

その後、サービス内で使用できます。このセッションはタペストリーによってスレッドごとのサービスとして管理されます。最初の使用時に開かれ、リクエストの終了後に閉じられます。

タペストリーマネージドサービス内で休止状態トランザクションを使用するには?

これは、注入されたHibernateSessionManagerを使用して手動で行うことができます。

@Inject
private HibernateSessionManager manager;

public void doSomeWork(Entity entity) {
  try {
    session.delete(entity);
    manager.commit();
  } catch (Exception e) {
    manager.abort();
  }
}

または、すべてのトランザクション メソッドにアノテーションを付け、HibernateTransactionAdvisorを使用してサービス@CommitAfterアドバイスすることもできます。

public interface MyService {

  @CommitAfter
  void doSomeWork(Entity entity);

}

public class MyTapestryModule {
  @Match("*Service")
  public void adviseTransactions(HibernateTransactionAdvisor advisor,
                                 MethodAdviceReceiver receiver) {
    advisor.addTransactionCommitAdvice(receiver);
  }
}

または、 HibernateTransactionDecoratorを使用してサービスをデコレートできます:

public class MyTapestryModule {
  @Match("*Service")
  public <T> T decorateTransactions(Class<T> serviceInterface,
                                    T delegate,
                                    String serviceId,
                                    HibernateTransactionDecorator decorator) {
    return decorator.build(serviceInterface, delegate, serviceId);
  }
}

使い方。メソッド呼び出しの前に新しいトランザクションを開始し、後でコミットを試みます。メソッドの呼び出し中にエラーが発生した場合、このトランザクションはロールバックされます。

于 2013-03-22T11:39:13.553 に答える
1

HibernateSessionManager の代わりに、セッションを直接 @Inject できます。

セッション タペストリーが提供するのは、実際にはスレッドごとの遅延読み込みプロキシです。基礎となるセッションはタペストリーによって管理され、各リクエストの後に PerThreadManager によってクリーンアップされます。

それはほとんど魔法です!

于 2013-03-21T22:38:35.053 に答える