有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaCDIBeans和JPA事务

例如用作cdi应用程序作用域的bean应该包含jpa读/写内容,还是应该始终使用EJB来处理db内容?我在互联网上的某个地方读到,cdi不应包含db内容。这是真的吗


共 (2) 个答案

  1. # 1 楼答案

    答案总是取决于。。。这取决于您的特定用例

    在JavaEE中,我们使用@EJBbean作为插入EntityManager的位置,以便稍后对JPA实体执行读/写操作。 我们为什么这样做?因为我们需要Transactions。默认情况下,当您使用@Stateless注释bean时,其中的所有方法都是Transactional,您可以免费获得所有方法。事务使您能够以原子方式更新多个表,它们要么全部成功,要么失败

    例如: 在您的方法updateABC()中,您希望更新表A、B、C,并希望它们全部成功或回滚事务:

    @Stateless
    public class MyClass{
        @PersistenceContext
        EntityManager em;
    
        public void updateABC(){
           A a= em.find(A.class, aId);
           //here update some fields on the entity "a"
    
           B b= em.find(B.class, bId);
           //here update some fields on the entity "b"
           C c= em.find(C.class, cId);
           //here update some fields on the entity "c"
        }
    }
    

    就是这样。。。你完了。你的所有更新都会神奇地保存到数据库中,或者什么都没有

    你需要这样的东西吗?选择EJB。 你不需要吗?你想手动完成这项工作吗?然后创建自己的bean

  2. # 2 楼答案

    是的,如果您使用的是任何JavaEE 7plus版本或JakartaEE

    看看Javadoc:@Transactional

    以下是用CDI注入EntityManager而不注入EJB的步骤

    1. 首先创建一个生产者来生成EntityManager

      public class EntityManagerProducer {
        @PersistenceContext(name = "customer-orders-unit")    
        private EntityManager em;
      
        @Produces
        @RequestScoped
        public EntityManager getEntityManager() {
          return em;
        }
      }
      
    2. 创建bean来执行DAO操作

      public MyCDIBeanDao{
        @Inject
        private EntityManager m_entityManager;
      
        @Transactional
        public doStuff(){
          // Here you are in a Container managed Transaction
          m_entityManager.persist(...)
        }
      }
      
    3. 别忘了在WEB-INF文件夹中添加beans.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
             http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd" 
             bean-discovery-mode="all" 
             version="2.0">
      </beans>