How does the UserTransaction and the EntityManager interact?

旧城冷巷雨未停 提交于 2019-12-03 07:08:19

问题


This is an academic question; I have no broken code in relation to this. I just want to expand my understanding of what is happening under the hood.

The code pattern I have been using (copied from books and tutorials) in my JPA DAO for my typical JSF web applications is basically this:

public class someDAO {

    @PersistenceContext protected EntityManager   em;
    @Resource           private   UserTransaction utx;    

    public void persist(Entity entity) {
        try {
            utx.begin();
            em.persist(entity);
            utx.commit();
        } catch ( // gawd awful long list of possible exceptions ) 

        // etc

So my questions are as follows:

  1. Why are the EntityManager instance and the UserTransaction instance injected with annotations from two seemingly unrelated packages?

  2. Why is the annotation @Resource and @PersistenceContext rather than @ManagedProperty or perhaps @Inject used?

  3. How does the persist() method access and interact with the utx object? If I forget the utx.begin() call the entity manager knows about it and throws and exception. It must be finding the UserTransaction object in some magic way. Wouldn't it have been better architecture to define the interface like: em.persist(utx, entity)?

  4. If utx is some sort of singleton -- is it possible to have more than one UserTransaction open at a time?

Much thanks for any discussion.


回答1:


  1. Because UserTransaction is part of Java Transaction API (JTA) and EntityManager is part of Java Persistence API (JPA). JTA is not part of JPA. JPA uses services provided by JTA.

  2. Isn't ManagedProperty is some annotation which is valid only in classes annotated with @ManagedBean. Maybe it was considered better to not inject UserTransaction different way in managed beans.

  3. JNDI lookup for active transaction. Reserved name seems to be java:comp/UserTransaction. One implementation: http://www.java2s.com/Open-Source/Java-Document/Database-ORM/hibernate/org/hibernate/transaction/JTATransactionFactory.java.htm

  4. It is not some sort of singleton, you can have more than one. But only one per thread can be active.



来源:https://stackoverflow.com/questions/7617026/how-does-the-usertransaction-and-the-entitymanager-interact

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!