2014-10-11 82 views
0

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

有状态会话的代码似乎更简单。在这个用户欢迎的情况下,两者都应该工作?

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

UserDao.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); 
    } 
} 
} 

回答

0

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

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