Java CDIBeans和JPA事务

Java CDIBeans和JPA事务,java,jpa,cdi,Java,Jpa,Cdi,例如用作cdi应用程序作用域的bean应该包含jpa读/写内容,还是应该始终使用EJB来处理db内容?我在互联网上的某个地方读到,cdi不应包含db内容。这是真的吗?答案总是取决于。。。这取决于您的特定用例 在JavaEE中,我们使用@EJBbean作为插入EntityManager的位置,以便稍后对JPA实体执行读/写操作。 我们为什么这样做?因为我们需要事务。默认情况下,当您使用@Stateless注释bean时,其中的所有方法都是事务性的,您可以免费获得所有方法。事务使您能够以原子方式更新

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

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

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

例如: 在您的方法
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…

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

看看Javadoc:

以下是使用
CDI
注入
EntityManager
而不使用
EJB

  • 首先创建一个producer来生成
    EntityManager

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

    public MyCDIBeanDao{
      @Inject
      private EntityManager m_entityManager;
    
      @Transactional
      public doStuff(){
        // Here you are in a Container managed Transaction
        m_entityManager.persist(...)
      }
    }
    
  • 不要忘记在
    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>
    
    
    

  • 一般来说,一句话在互联网上不是一个好问题。你能在问题中添加一些上下文吗?好的,我添加了更多,请看一看,但我更喜欢cdi,而不是ejb。。这里是使用cdi做同样事情的方法吗?您喜欢cdi多于EJB是什么意思?它们有不同的用途。在您的用例中,EJB是正确的技术。当然,您可以自己在CDIBean中实现,但是您需要手动实现transctions边界,这意味着您将在EJB中手动转换CDI。。。如果你想这样做,继续。cdi有什么用途?cdi有很多功能(取决于你使用的cdi版本)。然而,最基本的是:功能强大且类型安全的DI(依赖项注入)、拦截器、装饰器、事件等。然而,EJB具有额外的功能。阅读这篇博文,它可能会澄清一些想法:@Alboz:no.使用
    @Transactional
    拦截器绑定,你没有什么可做的了。只需注释您的方法(在容器管理的bean上),就可以了。它是EJB事务管理的替代方案。你不必管理UseTransation,这是拦截器DOR所做的。这应该是OP问题的公认答案。