【发布时间】:2015-01-29 12:40:43
【问题描述】:
我试图通过将 JPA 实体侦听器标记为 @Configurable 来了解 Spring 上下文。但是注入的spring beans是空的。能够使用相同的技术使 JPA 实体了解 Spring 上下文。我使用 Spring(core and data-jpa) 作为基础设施。关于如何使用 JPA Entity Listeners 或 spring data-jpa 来实现这一点的任何想法?
@Configurable
@Scope("singleton")
public class AggregateRootListener {
private static Logger log = LoggerFactory.getLogger(AggregateRootListener.class);
@Autowired
private EventHandlerHelper eventHandlerHelper;
@PostPersist
@PostUpdate
public void publishEvents(BaseAggregateRoot aggregateRoot){
log.info(aggregateRoot.getEvents().toString());
aggregateRoot.getEvents().stream()
.forEach(event -> {
eventHandlerHelper.notify(event, aggregateRoot);
log.info("Publishing " + event + " " + aggregateRoot.toString());
});
}
}
和 BaseAggregateRoot 代码
@Configurable
@Scope("prototype")
@MappedSuperclass
@EntityListeners(AggregateRootListener.class)
public abstract class BaseAggregateRoot extends BaseDomain{
public static enum AggregateStatus {
ACTIVE, ARCHIVE
}
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "aggregateId", column = @Column(name = "ID", nullable = false))})
protected AggregateId aggregateId;
@Version
private Long version;
}
【问题讨论】:
-
还有一个重复的:stackoverflow.com/questions/12155632/… -- 但我认为stackoverflow.com/questions/8616146/… 有更好的答案
-
这两个问题的解决方案都使用 Hibernate 或 Eclipse Link。我想知道是否存在与 JPA 实现无关的解决方案。解决方案不应特定于框架,应基于 JPA 实体侦听器。
-
deepintojee.wordpress.com/2012/02/05/… -- 另一种方法是使用
@Configurable和AspectJ,然后您可以在new创建的实例中使用@Autowire
标签: spring jpa aspectj spring-data-jpa