RequestedScopre ManagedBean VS Stateful Bean

Как выбрать реализацию класса UserDao? Один из них — сеансовый EJB с отслеживанием состояния, а другой — управляемый сеансовый компонент с аннотацией RequestedScope.

Код сеанса с отслеживанием состояния кажется намного проще. В этом случае приветствия пользователя оба должны работать?

Кроме того, какова область действия 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);
    }
}
}

person marlon    schedule 11.10.2014    source источник


Ответы (1)


EJB проще только из-за использования UserTransaction в другом bean-компоненте, в настоящее время с CDI 1.1 вы можете делать то же самое в CDI, что и в своем EJB (просто аннотируйте bean-компонент или методы с помощью TransactionAttribute.REQUIRED).

Однако вам не следует помечать свой компонент DAO как Stateful или SessionScoped, DAO по своей природе является службой без сохранения состояния, поэтому вы, вероятно, ищете Stateless или RequestScoped. Я бы выбрал простой CDI (если вам не нужны другие функции EJB, такие как асинхронные вызовы), он получает все больше и больше вещей от EJB (например, транзакций), и я предполагаю, что эти две технологии в конечном итоге будут объединены.

person Petr Mensik    schedule 12.10.2014