Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 将无状态EJB注入另一个无状态EJB并使用PersistenceContext_Jpa_Jakarta Ee_Java Ee 7_Persistence.xml_Ejb 3.2 - Fatal编程技术网

Jpa 将无状态EJB注入另一个无状态EJB并使用PersistenceContext

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

有了JEE 5/EJB3.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;
@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来控制服务,但这不是正确的方法,只是一种最佳实践模式