将一个无状态EJB注入到另一个无状态中,并使用PersistenceContext。

问题描述 投票:0回答:1

随着JEE 5 EJB 3.0的推出,Java开发者的生活变得更加轻松。 后来,受Spring和CDI的影响,类似的方法也在JEE中被采用。现在,我希望我做的是正确的,但只是为了确定:我有几个无状态的EJB,它们都可以查询和修改数据库。一个例子是

@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;

在无状态EJB中,我有像下面这样的公共方法。

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public void saveEntity(Home home) throws EntityExistsException {
     this.em.persist(home);
     addressDBservice.saveAddress(home.getMainAddress(), home);
   }

我几乎可以肯定这种用法是正确的,而且是线程安全的(上述服务又被注入JSF Managed Beans)。

我的用法似乎符合以下问题。

EntityManager真的是线程安全的吗?

无状态的EJB与更多注入的EJB实例。

jpa jakarta-ee java-ee-7 persistence.xml ejb-3.2
1个回答
1
投票

在不知道项目目标的情况下,"是正确的吗?"这个问题是无法回答的,它可以工作吗?是的,你已经发布了java-ee代码,可以部署,但还不够。

我通常使用BCE(Boundary Control Entity)模式和Domain Driven模式。在这种模式下,我们使用EJB来做业务逻辑服务或端点(JAX-RS),其他所有的注入,都是控制部分,都是CDI对象。

实体(JPA)可以使用级联来避免手动保存相关实体。

addressDBservice.saveAddress(home.getMainAddress(), home);

如果你像这样定义实体,可以避免。

@Entity
public class Home {
    @ManyToOne(cascade=ALL)
    private Address mainAddress;
}

这个... @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 注释通常响应于特定的交易行为,并不是必须的,所以只有当你想做的时候才是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.