【发布时间】:2013-09-10 12:34:34
【问题描述】:
领队想在Entity类里面写一些业务方法,比如:
@Entity
public class SomeProcess extends SomeProcessBase implements Serializable {
@SomeInterceptor
public void start() {
//do some business logics
}
@SomeInterceptor
public void abort() {
// do some business logics
}
...
}
我们可以使用CDI拦截器机制来拦截非上下文实体对象吗?
【问题讨论】:
-
您想要使用 CDI 拦截器而不是直接使用 JPA's own interceptors (listeners) 如
@PrePersist、@PreUpdate和朋友的具体原因是什么?为什么不直接在与实体关联的业务服务类中完成 CDI 工作? -
感谢 BalusC 的回复。我们正在做基于生命周期验证和通知的转换(它使实体,一个反应对象,从一个状态转换到另一个状态)。
-
例如,一旦“SomeProcess”实体对象已经处于“started”状态,则不会调用start方法,会发生异常事件让用户或后端服务知道启动请求是非法的。所以Entity的生命周期拦截器是不够的。
-
好的。那么为什么类是 JPA 实体而不是真正的业务服务呢?
-
根据核心J2EE模式,有应用服务模式和业务对象(实体或复合实体)模式。而应用服务模式就是解耦不同业务对象之间的依赖关系。业务对象可以实现为实体对象本身或业务服务。我们更喜欢封装,所以我们选择了业务对象,我们认为业务服务打破了实体属性访问的一些封装。业务服务可用于在业务领域内执行逻辑,其范围超出实体对象生命周期本身。