Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Java 在另一个EJB中调用EJB是否健康?_Java_Hibernate_Jsf_Jakarta Ee_Primefaces - Fatal编程技术网

Java 在另一个EJB中调用EJB是否健康?

Java 在另一个EJB中调用EJB是否健康?,java,hibernate,jsf,jakarta-ee,primefaces,Java,Hibernate,Jsf,Jakarta Ee,Primefaces,我正在JavaEE、JSF/Primefaces和hibernate下创建一个文档共享平台。对于每个数据对象(文档、存储库和用户),我创建了一个事件列表以存储各种事件(用户创建、文档修改等) 为了尊重分层体系结构,我有一个定义数据对象的模型层、一个定义会话bean(包含逻辑)的业务层和一个定义应用程序视图的表示层 我为每个数据对象创建了一个会话bean来编码其处理。因此,我有一个EventsSessionBean来处理事件的持久性和获取,只要UserSessionBean,DocumentSes

我正在JavaEE、JSF/Primefaces和hibernate下创建一个文档共享平台。对于每个数据对象(文档、存储库和用户),我创建了一个
事件列表以存储各种事件(用户创建、文档修改等)

为了尊重分层体系结构,我有一个定义数据对象的模型层、一个定义会话bean(包含逻辑)的业务层和一个定义应用程序视图的表示层

我为每个数据对象创建了一个会话bean来编码其处理。因此,我有一个
EventsSessionBean
来处理事件的持久性和获取,只要
UserSessionBean
DocumentSessionBean

例如,在创建用户时,我需要在创建之前将
UserCreated
事件保存在数据库中。因此,我必须调用方法
public Event createEvent(字符串标签)EventsSessionBean
UserSessionBean
中的code>

这是一种“健康”的编码方式吗?恐怕我的责任混淆了

代码段:

//Class definition
@PersistenceContext
private EntityManager em;
@EJB
private EventSessionBeanLocal eventService;
public static final String EVENT_USER_CREATION = "UserCreated";

public  RepositoryOwner createRepositoryOwner(/* username, email, ..etc*/){
    Event event = eventService.createEvent(EVENT_USER_CREATION);
    RepositoryOwner newUser = new RepositoryOwner();
    LinkedList<Event> events = new new LinkedList<>();
    events.add(event);
    newUser.setEvents(events);
    //Set other user attributes
    newUser = em.merge(newUser);
    return newUser;
}
//类定义
@持久上下文
私人实体管理者;
@EJB
private EventSessionBeanLocal eventService;
公共静态最终字符串事件\u USER\u CREATION=“UserCreated”;
public RepositoryOwner createRepositoryOwner(/*用户名、电子邮件等*/){
Event-Event=eventService.createEvent(事件\用户\创建);
RepositoryOwner newUser=新RepositoryOwner();
LinkedList事件=新建LinkedList();
事件。添加(事件);
newUser.setEvents(事件);
//设置其他用户属性
newUser=em.merge(newUser);
返回新用户;
}

当处理事件时,认为
UserSessionBean
作用于超出其范围的事情是错误的吗?

这没什么错,这是常见的做法。另一种方法(是否可以应用它取决于您的需求和业务逻辑)是使用消息队列(MQ),您可以将其用于此类任务。例如,在创建用户时,
UserSessionBean
会向队列中添加一条消息,有些人会得到该消息,并调用
EventSessionBean
来持久化该事件


但是,正如我所说的,这取决于您的要求,这是否可以很好地使用。

这是完全健康的。只有对代码进行了修订的描述,就不可能说实际执行的操作是否健康。当然,从EJB内部调用EJB是完全可以的(事实上,您应该这样做),但这并不意味着您拥有的任何代码都在做正确的事情。@Gimby您怎么看?@Hichamov Flat简单代码,可读性强,能够以可重用的方式正确地分离关注点。我不明白你为什么怀疑眼前的事情。我最关心的是我每一颗豆子的责任。在这个问题上,我很容易想到,
UserSessionBean
正在处理超出其范围的事件创建。我的要求非常宽松,我将研究MDB方法(从不使用MDB)