Java ee EJB中的服务层和dao层

马苏德·艾哈迈德(Masood Ahmad)

问题:在Java EE和EJB的背景下,任何人都可以显示具有两种不同方法的特定DAO类(或多个)。和一个服务类,该服务类在一个事务边界中回滚调用这2个方法?

我有一个EJB,但想像在Spring @Transactional方法中一样将其用作服务层。

1)这是个好主意吗?

2)如何在一种方法中的一个“事务”中进行许多dao方法调用?我认为我必须在transaction.begin()和上制定一些策略。comit()?任何人都可以显示一个代码示例吗?

一些主要优点是:

a-所有小的不可变DAO事务都将在(在中single transactional boundries建立的单个数据库连接中“一次性完成”。

b-如果说我在服务器中有4个dao调用,而第三个失败,因为它是一个事务性绑定,所以我可以做roll backs

c-我immutable DAO methodsre-usable在其他许多地方。

Java EE示例:

import com.....entities.Users;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

@Stateless
public class UsersBean {

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")

    public Users sayHello() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("CommunityPU");
        EntityManager em = emf.createEntityManager();
        Users user =  em.find(Users.class, 1);
        em.close();
        emf.close();
        return user;
    }

}

与春季:

@Controller
class MyControllerClass {

      @RequestMapping...
      method(){
         ServiceCall()...
      //put something to modelAndView object here and redirect to jsp page.
      return "home"; // this will redirect data to home.jsp

      }
}

//Service class /////////

@Service
class MyServiceClass{
      @Transactional
      SomeServiceMethod(){ 
        DaoMethod(); 
        SomeMoreDaoMethods();
      }

}

//Dao class ////////

@Autowired
EntityManager em;

@Repository
class MyDaoClass{
   DaoMethdon(){em.find(...)}

}

/view/myjsps.jsp  path to view directory set in spring.xml

编辑-1(与问题交叉回答以进一步阐明)


1)DAO本身会是一个EJB吗?EJBs严格service layers要求其他immutable dao methods(位于dao类中)。

2)我们不会entitymanagerEJBs使用Daos正确的?

3)或使用@Transactional(直到Java EE 7仅EJB,其中事务性和@Transactional注释不存在。)或@TransactionAttribute

4)如果我们使用非@stateless,该怎么办。然后,它不会在一个事务边界中管理daos而不使用回滚吗?

RND链接:

https://stackoverflow.com/a/17840851

http://docs.oracle.com/javaee/5/tutorial/doc/bncij.html

尼伯(JB Nizet)

是个好主意吗?

是的。基本上,这就是EJB的目的。

如何在一种方法中的一个“事务”中进行许多dao方法调用?

您只需执行以下操作:

 @Stateless
 public class MyService {

     @Inject
     private FirstDao firstDao;

     @Inject
     private SecondDao secondDao;

     // stateless EJBs are transactional by defaults.
     public void doStuff() {
         firstDao.doSomething();
         secondDao.doSomethingElse();
     }
}

EJB默认是事务性的。您无需以编程方式启动和提交事务。容器会为您完成此操作:如果2个DAO调用中的任何一个抛出运行时异常,则事务将回滚。否则,它将提交。

还要注意,服务EJB不应使用实体管理器。这就是DAO的目的:处理持久性。因此,DAO应该是使用实体管理器的DAO:

public class FirstDao {
    @PersistenceContext
    private EntityManager em;

    ...
}

关于您的最后一个问题:

  1. DAO本身可以是EJB,但这不是必需的,因为事务通常由服务层划分。
  2. 我已经回答了。当然,数据访问对象是必须使用EntityManager的对象,因为它们的工作是处理持久性,而EntityManager用于访问数据库。
  3. 按照您想要的方式进行。重要的是,无论您以何种方式使服务具有事务性,您的服务都应该是事务性的。引入事务性是为了消除对EJB的需求,并具有事务性CDI Bean。如果您喜欢这种方式,那就好。

小提示:不变的方法没有任何意义。当某种事物(如对象)的状态永不改变时,它不可变的。方法没有状态。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章