2014-10-11 8 views
0

UserDao 클래스의 구현을 선택하는 방법은 무엇입니까? 하나는 Stateful Session EJB이고, 다른 하나는 RequestedScope 주석이있는 Managed Session Bean입니다.요청 된 Scopre ManagedBean VS 상태있는 Bean

상태 기반 세션의 코드는 훨씬 간단 해 보입니다. 이 사용자 인사말의 경우 모두 작동해야합니까?

또한 stateful 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 요즘에 불과하기 때문에 다른 콩에 UserTransaction를 사용하여 간단합니다 CDI 1.1에서는 EJB와 마찬가지로 CDI에서 동일한 작업을 수행 할 수 있습니다 (bean에 주석을 달거나 m 소수 민족에 TransactionAttribute.REQUIRED).

DAO 빈은 Stateful 또는 SessionScoped로 표시하면 안되며 DAO는 기본적으로 Stateless 서비스이므로 Stateless 또는 RequestScoped를 찾고있을 수 있습니다. 일반 CDI (비동기 호출과 같은 다른 EJB 기능이 필요하지 않은 경우)를 사용하면 EJB (트랜잭션과 같은)에서 점점 더 많은 것을 얻게되고 결국이 두 기술이 병합 될 것입니다.