例如用作cdi应用程序作用域的bean是否包含jpa读/写内容?或者我应该始终使用EJB作为db的东西吗?我在互联网上的某处读到cdi不包含数据库内容。这是真的吗?
答案 0 :(得分:5)
是的,如果你在任何JavaEE 7 plus 版本或 JakartaEE 上,你可以使用 @Transactional
InterceptorBinding来管理CDI bean上的数据库内容强>
看看Javadoc:@Transactional
以下步骤EntityManager
CDI
注入EJB
首先创建一个生产者来生成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(...)
}
}
不要忘记在beans.xml
文件夹中添加WEB-INF
。
<?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>
答案 1 :(得分:3)
一如既往,答案取决于......这取决于您的具体用例。
在Java EE中,我们使用@EJB
bean作为我们注入EntityManager
以便稍后在JPA实体上执行读/写的位置。
为什么我们这样做?因为我们需要Transactions
。默认情况下,当您使用@Stateless
注释bean时,其中的所有方法都是Transactional
,您可以免费获得所有方法。事务使您能够以原子方式更新多个表,它们将全部成功或失败。
实施例:
在您的方法updateABC()
中,您希望更新表A,B,C,并且您希望所有这些都成功或者事务是Roll-backed:
@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 ...