【发布时间】:2014-02-13 02:08:15
【问题描述】:
我确定这与this question 密切相关,但关于该问题的操作有一些场景,我甚至不确定是否对 DI 有意义。所以这就是我的理解,尝试将 JPA 实体与 CDI Bean 混合通常不是一个好主意,因为两者通常都是通过创建代理对象来完成的。这是我的设想,但根据我的阅读,这是不可能的。
@Entity
public class MyUniqueObject implements Serializable {
@Inject
private transient Logger log;
@Inject
private transient Event<MyUniqueObjectEvent> events;
@Id
private long id;
@NotNull
private String text;
public void setText( final String text ) {
log.debug( "updating text {}", this );
this.text = text;
events.fire( new MyUniqueObjectEvent( this ) ); // consumed by an @Observes method
}
}
什么是最好的方法来做我想要完成的事情?这基本上是从 JPA 持久化实体中触发的事件、对日志对象的访问。代码示例很有帮助。
【问题讨论】:
-
我可以看到您要执行的操作,但在我看来,您仍然在尝试将业务逻辑添加到实体 bean,因此在我看来这里有些问题。相反,我会将实体发送到某个业务逻辑类,该类可能会观察实体的变化。 (当然,您必须将 setText() 包装到业务对象中的其他内容),或者您可以使用某种 AOP 方式来拦截实体 bean 中的方法。不确定,只是一些想法。
-
@Leo 实体 bean 不允许有业务逻辑吗?我认为像 Hibernate 这样的东西的目的是能够直接持久化业务对象? Data Mapper
-
好吧,我知道实体 bean 没有逻辑,它们只有数据,而 hibernate 只是处理它们的持久性。业务逻辑,另一方面,我知道有逻辑但(大多数时候)瞬态。但是,你知道,没有黄金法则。
-
最后,我们只有一个问题、代码和开发人员;-)
-
目前我唯一的想法是通过休眠加载实体,然后调用受保护的设置器来添加记录器/事件/等对象。
标签: java hibernate jpa cdi weld