我们有一个基本的JSF / EJB / JPA Web应用程序,其中EJB业务bean与JPA /实体管理器一起工作并管理所有事务。
那是:
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和业务逻辑以允许这种情况发生并防止半/永久锁定(如果用户消失)?由于交易在业务层开始和结束,我不确定如何在用户在表示层中进行交互时锁定它并保持锁定。