【发布时间】:2014-08-15 12:39:16
【问题描述】:
问题:任何人都可以在 Java EE 和 EJB 的上下文中展示具有两种不同方法的特定 DAO 类(或多个)。以及一个在一个事务边界中调用这两种方法并进行回滚的服务类?
我有一个 EJB,但我想将它用作服务层,就像在 spring @Transactional 方法中一样。
1) 这是个好主意吗?
2) 如何在一种方法中的一个“事务”中调用多个 dao 方法?我想我必须对 transaction.begin() 和 .提交()?任何人都可以显示一个代码示例吗?
一些主要优点是:
a- 所有小的不可变 DAO 事务都将在建立的单个数据库连接中“一次性”提交(single transactional boundries)
b- 如果说我在服务器中有 4 个 dao 调用,而第三个调用失败,因为它是一个事务边界,我可以做 roll backs。
c- 我的immutable DAO methods 在许多其他地方将是re-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) 我们不会在EJBs 中使用entitymanager,而是在Daos 中使用。正确的?
3) 使用@Transactional 怎么样(直到Java EE 7 只有EJB,其中事务性和@Transactional 注释不存在。)或@TransactionAttribute。
4) 如果我们使用非@stateless 会怎样。那么它不会在一个事务边界中管理 daos 而不使用回滚?
RND 链接:
【问题讨论】:
标签: spring jakarta-ee spring-mvc java-ee-6 java-ee-7