0

有了 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

4

1 回答 1

1

“正确吗?” 如果不知道项目的目标,就无法回答问题。它可以工作吗?是的,您已经发布了可以部署的 java-ee 代码,但这还不够。

我通常使用 BCE(边界控制实体)模式和域驱动模式。在此模式中,我们将 EJB 用于业务逻辑服务或端点 (JAX-RS),所有其他注入(即控制部分)都是 CDI 对象。

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

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

如果您像这样定义实体,则可以避免:

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

注释通常响应特定的@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)事务行为,不是必需的,因此只有在您想要做的时候才是正确的。

于 2020-06-10T15:00:12.497 回答