@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"
}
}
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(...)
}
}
# 1 楼答案
答案总是取决于。。。这取决于您的特定用例
在JavaEE中,我们使用
@EJB
bean作为插入EntityManager
的位置,以便稍后对JPA实体执行读/写操作。 我们为什么这样做?因为我们需要Transactions
。默认情况下,当您使用@Stateless
注释bean时,其中的所有方法都是Transactional
,您可以免费获得所有方法。事务使您能够以原子方式更新多个表,它们要么全部成功,要么失败例如: 在您的方法
updateABC()
中,您希望更新表A、B、C,并希望它们全部成功或回滚事务:就是这样。。。你完了。你的所有更新都会神奇地保存到数据库中,或者什么都没有
你需要这样的东西吗?选择EJB。 你不需要吗?你想手动完成这项工作吗?然后创建自己的bean
# 2 楼答案
是的,如果您使用的是任何JavaEE 7plus版本或JakartaEE
看看Javadoc:@Transactional
以下是用
CDI
注入EntityManager
而不注入EJB
的步骤首先创建一个生产者来生成
EntityManager
创建bean来执行DAO操作
别忘了在
WEB-INF
文件夹中添加beans.xml