我正在使用JBoss 7.1.1 Final,Weld,Hibernate 4,Seam 3开发,我不理解以下行为。我使用Seam Managed Persistence Context for Entity manager和Persistence Interceptor来自Seam 3.我有以下CDI Bean:
@ViewScoped
@Named
public class RegistrationController implements Serializable {
@Inject
private RegisterService service;
@Inject
private EntityManager em;
public void register() {
Person p = service.register("username","password");
Person pp = em.find(Person.class, p.getId()); //returns null
}
}
关注EJB
@Stateless
@Local(IRegisterService.class)
public RegisterService implements IRegisterService {
@Inject
private EntityManager em;
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public Person register(String username, String password) {
return em.merge(new Person(username, password));
}
}
因此,由于我使用Seam Persistence模块,我认为会发生这种操作流程:
1)从前端
调用registrationController.register()2)启动新交易A
3)service.register(...)被称为
4)暂停事务A并创建事务B以执行service.register(因为它由REQUIRES_NEW注释)
5)执行service.register(...)已完成
6)交易B已提交
7)由于我使用COMMIT flush类型,因此将调用flush
8)交易A被打开
现在,em.find(Person.class,p.getId())正试图找到只是持久的人。由于事务B已提交且实体管理器已刷新,因此应该找到它。但它返回null。如果我手动刷新,那么它可以工作。
我在哪里弄错了?有一些误解吗?
答案 0 :(得分:0)
从查看代码我会说 - 因为RegistrationController
是一个普通的托管bean - 它将不启动自己的事务。这基本上意味着你有一个交易B。