gpt4 book ai didi

spring - Java EE EJB 中的服务层和 Dao 层

转载 作者:行者123 更新时间:2023-12-03 21:31:42 25 4
gpt4 key购买 nike

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

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

1) 这是个好主意吗?

2) 我怎样才能在一个方法的一个“事务”中调用多个 dao 方法?我想我必须对 transaction.begin() 和 制定一些策略。提交()?谁能展示一个代码示例?

一些主要优势是:

a- 所有小的不可变 DAO 事务都将在建立的单个数据库连接中“一次性”提交(在单个事务边界中)

b- 如果说我在服务器中有 4 个 dao 调用并且第三个失败,因为它是一个事务边界,我可以执行回滚

c- 我的不可变 DAO 方法 将在许多其他地方可重用

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

}

对比 Spring :

@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 吗?或 EJB 是严格的服务层,调用其他不可变的 dao 方法(驻留在 dao 类中)。

2) 我们不会在 EJB 中使用 entitymanager,而是在 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

最佳答案

Is is a good idea?

是的。基本上,这就是 EJB 的用途。

how can I make many dao method calls in one "transaction" in one method?

你只需这样做:

 @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 应该是使用实体管理器的:

public class FirstDao {
@PersistenceContext
private EntityManager em;

...
}

关于您最后的问题:

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

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

关于spring - Java EE EJB 中的服务层和 Dao 层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24400382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com