2017-03-24 62 views
2

是否应该将一个例如用作cdi应用程序作用域的bean包含jpa读/写的东西,还是应该总是使用EJB for db stuff?我在互联网上的某个地方读过cdi不应该包含数据库的东西。真的吗?CDI Beans和JPA Transactions

+0

通常,单个句子在互联网上并不是一个好问题。你可以在问题中添加一些上下文吗? – halfer

+0

好吧,我添加了更多,请看看 – Joey

回答

3

一如既往,答案取决于......这取决于您的具体使用情况。

在Java EE中,我们使用@EJB beans作为我们注入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。 你不需要?你想手动完成这项工作吗?然后创建自己的豆...

+0

但我喜欢更多的cdi而不是ejb .. ist在这里用cdi做同样的事情? – Joey

+1

你是什么意思你喜欢比EJB更多的CDI?他们有不同的目的。在你的用例中,EJB是正确的技术。当然,你可以在CDI bean中自己做,但是你需要手动实现转换边界,这意味着你将手动把你的CDI转换成EJB ......如果你喜欢这样做,继续下去。 – Alboz

+0

cdi服务的目的是什么? – Joey

1

是的,你可以使用@Transactional管理数据库上的东西,如果你在Java EE 7服务器上。

看一看的Javadoc:http://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.html

例如,你可以有一个CDI豆,其doStuff方法注解@Transactional

public MyCDIBean{ 
    @Inject 
    private EntityManager m_entityManager; 

    @Transactional 
    public doStuff(){ 
     // Here you are in a Transaction 
     m_entityManager.persist(...) 
    } 
} 

使用生产商生产EntityManager

public class EntityManagerProducer { 

    @PersistenceContext  
    private EntityManager em; 

    @Produces 
    @RequestScoped 
    public EntityManager getEntityManager() { 
    return em; 
    } 
}