java ee EJB中的服务层和dao层

Mas*_*mad 2 spring spring-mvc java-ee java-ee-6 java-ee-7

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

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

1)这是个好主意吗?

2)如何在一个方法中的一个"事务"中进行多个dao方法调用?我想我必须在transaction.begin()和.上制定一些策略.COMIT()?任何人都可以展示代码示例吗?

一些主要优点是:

a-所有小的不可变DAO事务将在单个数据库连接中的"一次性"中提交(in 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

与春天:

@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
Run Code Online (Sandbox Code Playgroud)

编辑 - 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链接:

/sf/answers/1248859601/

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

JB *_*zet 11

是个好主意吗?

是.这就是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();
     }
}
Run Code Online (Sandbox Code Playgroud)

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

另请注意,服务EJB不应使用实体管理器.这就是DAO的用途:处理持久性问题.所以DAO应该是使用实体管理器的DAO:

public class FirstDao {
    @PersistenceContext
    private EntityManager em;

    ...
}
Run Code Online (Sandbox Code Playgroud)

关于你的上一个问题:

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

小记:一个不可变的方法没有意义.当状态永不改变时,某些东西(如对象)是不可变的.方法没有状态.