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