以下を介した JPAContainer の初期化:
JPAContainerFactory.make(User.class, "persistenceUnitName");
アプリケーションの存続期間全体で EntityManager を 1 つだけ使用し、他のセッションでも同じ EntityManager を使用します。また、この EntityManager は 1 つの DB 接続を開いており、常にビジー状態に見えます。このアプローチはあまり最適ではなく、アプリケーションのパフォーマンスのボトルネックになる可能性があります。
さて、JPAContainer は次の方法で初期化できます。
JPAContainerFactory.make(User.class, (EntityManager)enityManager);
このアプローチでは、新しい EntityManager (EM) をいつ作成するかを処理する必要があります。ユーザー/セッションごと、またはユーザー/セッションおよびエンティティごとに新しい EM を作成できます。これは有望に見えますが、JPAContainer には別のボトルネックがあります。JPAContainer は、EntityManager ごとに 1 つのビジー接続を使用します。そのため、独自の entityManager を使用して 100 個の JPAContainer を作成すると、接続プールに 100 個のビジー接続が含まれることになり、これは大きな問題です。したがって、接続解放モードを「after_transaction」に設定する必要があります。これにより、JPAContainer は各クエリの後に強制的に接続を解放します。
persistence.xml
<property name="hibernate.connection.release_mode" value="after_transaction" />
いずれにせよ、これらは JPAContainer を非常に使いやすくする単なるトリックですが、魔法は期待できません。JPAContainerには他にも多くの問題があります
- 遅延読み込みをサポートしていません
- バッチ読み込みをサポートしていません。各エントリは、1 つのクエリ + 各リレーションに対して 1 つのクエリによって読み込まれます。
- JPAContainer を更新する場合は、それ自体が循環し、更新に永遠に時間がかかります
この投稿を見てください。プレーンな JPA または Hibernate の namedQuery または CriteriaBuilder を BeanItemContainer と共に使用することをお勧めします。
変更をデータベース vaadin に保存します。