我正在使用带有 EJB/JPA 的 JBoss EAP 6.1.0。我有一个用户对象,其中包含他所属的几个组,我正在尝试使用三步方法在数据库中创建它:
- 保存用户
- 保存他所属的组
- 查询数据库并返回该新用户
我的问题是步骤 (3) 总是返回 null 因为提交尚未发生。在第 2 步和第 3 步之间添加一个em.flush()
没有帮助。我避免使用 Groups 进行任何 @CASCADE 注释,因此只保存用户并让 Groups 级联不是一种选择。这是示例代码:
@Stateless
public class RegistrationService {
@EJB
UserDao userDao;
public User registerNewUser(User user, List<Group> groups) {
userDao.saveNewUser(user);
userDao.saveNewGroupsToUser(user, groups);
return userDao.findUser(user);
}
}
这是一个简化的 UserDao:
@Stateless
public class UserDao {
@PersistenceContext
private EntityManager em;
public void saveNewUser(User user) {
em.persist(user);
}
public void saveNewGroupsToUser(User user, List<Group> groups) {
for (Group group : groups) {
GroupToUser groupToUser = new GroupToUser(user, group);
em.persist(groupToUser);
}
public User findUser(User user) {
return em.createQuery("from User where user = :userId")
.setParameter("userId",user.getUserId())
.getSingleResult();
}
}
我发现,如果我findUser(User)
用 a 注释该方法,@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
它会按预期工作。这是为什么?我以为registerNewUser()
创建了一个大事务,然后 findUser() 会创建一个不应该知道保存的嵌套事务?