如何选择UserDao类的哪个实现?一个是有状态会话EJB,另一个是带有RequestedScope注释的manged会话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 :(得分:0)
EJB更简单,因为在另一个bean中使用UserTransaction
,现在使用CDI 1.1,您可以在CDI中执行与EJB相同的操作(只需使用TransactionAttribute.REQUIRED
注释bean或方法) 。
但是,您不应将DAO bean标记为Stateful或SessionScoped,DAO本质上是无状态服务,因此您可能正在寻找Stateless或RequestScoped。我会选择普通的CDI(如果你不需要像异步调用这样的其他EJB功能),它会从EJB(例如事务)获得越来越多的东西,我想这两种技术最终会合并。