随着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)。
我的用法似乎符合以下问题。
在不知道项目目标的情况下,"是正确的吗?"这个问题是无法回答的,它可以工作吗?是的,你已经发布了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)
注释通常响应于特定的交易行为,并不是必须的,所以只有当你想做的时候才是正确的。