问题:在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 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)我们不会entitymanager
在EJBs
中使用Daos
。正确的?
3)或使用@Transactional
(直到Java EE 7仅EJB,其中事务性和@Transactional注释不存在。)或@TransactionAttribute
。
4)如果我们使用非@stateless,该怎么办。然后,它不会在一个事务边界中管理daos而不使用回滚吗?
RND链接:
是个好主意吗?
是的。基本上,这就是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;
...
}
关于您的最后一个问题:
小提示:不变的方法没有任何意义。当某种事物(如对象)的状态永不改变时,它是不可变的。方法没有状态。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句