Jpa 将无状态EJB注入另一个无状态EJB并使用PersistenceContext
有了JEE 5/EJB3.0,Java开发人员的生活变得更加轻松。后来,受Spring和CDI的影响,JEE也采用了类似的方法。 现在,我希望我做的是对的,但要确定的是: 我有几个无状态EJB,它们都查询和/或修改数据库。例如Jpa 将无状态EJB注入另一个无状态EJB并使用PersistenceContext,jpa,jakarta-ee,java-ee-7,persistence.xml,ejb-3.2,Jpa,Jakarta Ee,Java Ee 7,Persistence.xml,Ejb 3.2,有了JEE 5/EJB3.0,Java开发人员的生活变得更加轻松。后来,受Spring和CDI的影响,JEE也采用了类似的方法。 现在,我希望我做的是对的,但要确定的是: 我有几个无状态EJB,它们都查询和/或修改数据库。例如 @Stateless public class AddressDBService { @PersistenceContext protected EntityManager em; 一些无状态EJB引用其他服务,如下所示: @Stateless pub
@Stateless
public class AddressDBService {
@PersistenceContext
protected EntityManager em;
一些无状态EJB引用其他服务,如下所示:
@Stateless
public class AVeDBService {
@PersistenceContext
protected EntityManager em;
@Inject
private HomeToDealDBService homeToDealDBService;
@Inject
private AddressDBService addressDBservice;
@Entity
public class Home {
@ManyToOne(cascade=ALL)
private Address mainAddress;
}
在无状态EJB中,我有如下公共方法:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void saveEntity(Home home) throws EntityExistsException {
this.em.persist(home);
addressDBservice.saveAddress(home.getMainAddress(), home);
}
虽然我几乎可以肯定这种用法是正确的,而且线程是安全的,但上述服务反过来又被注入到JSF管理的bean中。
有人能确认我的使用是正确的,线程安全的,并且符合良好的实践吗
我的用法似乎符合以下问题:
答案正确吗?如果不知道项目的目标,这个问题是无法回答的。 它能起作用吗?是的,您已经发布了可以部署的JavaEE代码,但这还不够 我通常使用BCE边界控制实体模式和域驱动模式。 在这种模式中,我们将EJB用于业务逻辑服务或端点JAX-RS,所有其他注入(即控制部分)都是CDI对象 实体JPA可以使用级联避免手动保存相关实体: addressDBservice.saveAddresshome.getMainAddress,主页 如果您这样定义实体,则可以避免:
@Stateless
public class AVeDBService {
@PersistenceContext
protected EntityManager em;
@Inject
private HomeToDealDBService homeToDealDBService;
@Inject
private AddressDBService addressDBservice;
@Entity
public class Home {
@ManyToOne(cascade=ALL)
private Address mainAddress;
}
@TransactionattributetTransactionAttributeType.REQUIRES\u新注释通常响应特定的事务行为,这不是必需的,因此只有在您希望执行此操作时才正确。By是否正确?我的意思是,如果EJB和CDI能够以指定的方式一起工作,那么主要的问题是。您只讨论无状态EJB,我的观点是它可能是正确的,但是您可以使用简单的CDI来控制服务,但这不是正确的方法,只是一种最佳实践模式