Java CDIBeans和JPA事务
例如用作cdi应用程序作用域的bean应该包含jpa读/写内容,还是应该始终使用EJB来处理db内容?我在互联网上的某个地方读到,cdi不应包含db内容。这是真的吗?答案总是取决于。。。这取决于您的特定用例 在JavaEE中,我们使用Java CDIBeans和JPA事务,java,jpa,cdi,Java,Jpa,Cdi,例如用作cdi应用程序作用域的bean应该包含jpa读/写内容,还是应该始终使用EJB来处理db内容?我在互联网上的某个地方读到,cdi不应包含db内容。这是真的吗?答案总是取决于。。。这取决于您的特定用例 在JavaEE中,我们使用@EJBbean作为插入EntityManager的位置,以便稍后对JPA实体执行读/写操作。 我们为什么这样做?因为我们需要事务。默认情况下,当您使用@Stateless注释bean时,其中的所有方法都是事务性的,您可以免费获得所有方法。事务使您能够以原子方式更新
@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
EntityManager
public class EntityManagerProducer {
@PersistenceContext(name = "customer-orders-unit")
private EntityManager em;
@Produces
@RequestScoped
public EntityManager getEntityManager() {
return em;
}
}
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问题的公认答案。