我试图在春天使用guava eventBus来发送事件。 在事件处理程序内部我需要hibernate来获取一些数据-lazy fetch-但它会抛出错误
.hibernate.event.internal.DefaultLoadEventListener: HHH000327: Error performing load command : org.hibernate.SessionException: Session is closed!
并且事件总线抛出异常
GRAVE: Could not dispatch event
我的代码如下:
@Transactional
@AllowConcurrentEvents
@Subscribe
public void sessionEventReceived(Session session) {
session.getTeacher();
}
对于我有的实体会话:
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "TEACHER_ID")
protected Teacher teacher;
那么我可以在eventbus订阅者中使用@Transactional吗?
修改
我有一个使用对象会话(实体会话)发布事件的服务,因此可能在订阅者可以检索属性教师之前关闭hibernateSession,我该如何处理?
答案 0 :(得分:2)
要使@Transactional工作,标记为@Transactional
的方法应该由spring proxy调用。 Spring会做start/commit/rollback
工作。因此,如果您使用@Subscribe
添加注释,则可能无效。 (不确定,我应该测试或深入挖掘。)
但是您可以在订阅服务器中注入服务对象,并在处理函数中调用该服务的Transactional函数。