EJB ビジネス Bean が JPA / エンティティ マネージャと連携し、すべてのトランザクションを管理する基本的な JSF/EJB/JPA Web アプリケーションがあります。
あれは:
Page.xhtml => PageBean.java => BusinessBean.java => Entity.java
Page.xhtml はエンティティの値を表示します。PageBean は、メソッド呼び出し (例: BusinessBean.getEntityById(x)) を介してビジネス層からエンティティを取得します。ビジネス Bean は、次のようにエンティティを取得します。
public Entity getEntityById(String id) {
return EntityManager.find(Entity.class, id);
}
エンティティはプレゼンテーション層で編集され、フォームが送信されると、ビジネス Bean のバッキング ページ Bean からビジネス メソッドが呼び出されます。
public Entity saveExistingEntity(Entity e) {
Entity exists = entityManager.find(Entity.class, e.getId())
if(exists != null) {
entityManager.merge(e);
}
return e;
}
これがこれを行うための最良の方法であるかどうかはわかりませんが、この方法に関するコメントを歓迎します。
ただし、中心的な問題はロックの管理に関するものです。要件は、ユーザーがエンティティの「編集」ページに入ると、エンティティがロックされ、他のユーザーが他の方法でエンティティを編集できないようにすることです (たとえば、そのエンティティの編集ページに入るなど)。
ページ バッキング Bean とビジネス ロジックをどのように構築して、これを可能にし、ユーザーがいなくなった場合に半永久的なロックを防ぐことができるでしょうか? トランザクションはビジネス層で開始および終了するため、ユーザーがプレゼンテーション層で対話している間、トランザクションをロックしてそのロックを維持する方法がわかりません。