0

如何选择 UserDao 类的哪个实现?一个是有状态会话 EJB,另一个是带有 RequestedScope 注释的托管会话 bean。

有状态会话的代码似乎要简单得多。在这个用户欢迎案例中,两者都应该工作吗?

另外,有状态 EJB 的范围是什么?

用户道.java

public interface UserDao {
    User getForUsername(String username);

    void createUser(User user);
 }

EJBUserDao.java

@Stateful
@Alternative
public class EJBUserDao implements UserDao {

@Inject
private EntityManager entityManager;

public User getForUsername(String username) {
    try {
        Query query = entityManager.createQuery("select u from User u where u.username = ?");
        query.setParameter(1, username);
        return (User) query.getSingleResult();
    } catch (NoResultException e) {
        return null;
    }
}

public void createUser(User user) {
    entityManager.persist(user);
}
}

ManagedBeanUserDao.java

public class ManagedBeanUserDao implements UserDao {

@Inject
private EntityManager entityManager;

@Inject
private UserTransaction utx;

public User getForUsername(String username) {
    try {
        User user;
        try {
            utx.begin();
            Query query = entityManager.createQuery("select u from User u where u.username = :username");
            query.setParameter("username", username);
            user = (User) query.getSingleResult();
        } catch (NoResultException e) {
            user = null;
        }
        utx.commit();
        return user;
    } catch (Exception e) {
        try {
            utx.rollback();
        } catch (SystemException se) {
            throw new RuntimeException(se);
        }
        throw new RuntimeException(e);
    }
}

public void createUser(User user) {
    try {
        try {
            utx.begin();
            entityManager.persist(user);
        } finally {
            utx.commit();
        }
    } catch (Exception e) {
        try {
            utx.rollback();
        } catch (SystemException se) {
            throw new RuntimeException(se);
        }
        throw new RuntimeException(e);
    }
}
}
4

1 回答 1

0

EJB 更简单只是因为UserTransaction在其他 bean 中使用,现在使用 CDI 1.1,您可以在 CDI 中执行与在 EJB 中相同的操作(只需使用 注释 bean 或方法TransactionAttribute.REQUIRED)。

但是,您不应该将您的 DAO bean 标记为 Stateful 或 SessionScoped,DAO 本质上是一种无状态服务,因此您可能正在寻找 Stateless 或 RequestScoped。我会选择普通的 CDI(如果您不需要其他 EJB 功能,如异步调用),它从 EJB 获得越来越多的东西(例如事务),我猜这两种技术最终会合并。

于 2014-10-12T23:00:22.127 回答