2011-01-28 9 views
2

私はGlassfish 3、JPA、Java EE 6で作業していました。Webコンテナでは、EJBにEntity Managerを挿入して、ロールバックなど。私はデスクトップアプリケーションで何をしますか?明らかにそれは動作しません。私はORMのためにJPAを使い続けることを知っています。しかし、EntityMangerFactoryを作成し、それからEntityManagerを作成しますか?手動でトランザクションを処理する必要がありますか?私はいくつかのサンプルアプリケーションを見ることができれば素晴らしいだろう。ありがとう!Javaデスクトップアプリケーションでのデータベースアクセスを行う最良の方法

答えて

3
EntityManagerFactory entityManagerFactory = 
    Persistence.createEntityManagerFactory("DS"); 
em = entityManagerFactory.createEntityManager(); 

あなたは春・フレームワークや何か他のものを使用しない場合は、em.getTransaction.begin()em.getTransaction.commit()を呼び出すことにより、トランザクションを処理する必要があります。

2

私はSpring + JPAを試してみることをお勧めします。そこにはコンテナは必要ありません。単にアプリケーションコンテキストであり、トランザクションを設定することができます。 あなたはトランザクションの世話をしません。@Transactionalにしたいメソッドに注釈を付けるだけです。

+1

+1:私より44秒速い – Ralph

2

あなたはSpringを使うことができます。これは、JEE6からデスクトップアプリケーションまで知っているものです。 (もちろん、それは100%同じではありません!)

1

別のオプションは、Embeddable EJB Containerと呼ばれることもあります。それはあなたが慣れ親しんだかもしれない注射、CMTなどと同じサービスを提供することができます。

1

私はHibernateとSwingを使って2層のJava Swingクライアントを構築しましたが、私は再びそれをやりません。もし私が今日それを再構築しなければならなかったら、生のJDBCクエリ、あるいはiBatisのような非常に細いORMマッピングフレームワークを使用します。

デスクトップ環境でHibernate(と私の経験がHibernateのみであるにもかかわらず、他のJPA実装を想定していると仮定します)が非常に異なる理由は、オブジェクトがデスクトップ上で長持ちする傾向があり、2)オブジェクトがいつアクセスされるのかを知ることは非常に難しいので、遅延読み込みの正しいトランザクション処理には問題があります。

ウェブのリクエスト/レスポンスのパラダイムは基本的にトランザクションであるため、そこでのトランザクションの境界設定は非常に簡単です。デスクトップ上では、たとえMouseMovedEventだけであっても、すべてのキー押下で潜在的にデータベースクエリや遅延ロードが発生する可能性があるため、いつトランザクションを開始してコミットするのかを知ることはずっと難しくなります。

エラー処理とオブジェクトのリフレッシュは大きな問題です。オブジェクトの寿命が長くなる傾向があります(多くの場合、アプリケーションの起動中です)。 Hibernateでは、例外は回復不可能です。つまり、データベースからすべてをリロードすることになっています。これはウェブ上で問題ありませんが、GUI全体でさまざまなモデルに数千のオブジェクトが埋め込まれている場合は間違いありません。

関連する問題