将Spring Transactional与guava eventBus订阅者一起使用

时间:2015-08-19 18:26:03

标签: java spring hibernate guava event-bus

我试图在春天使用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,我该如何处理?

1 个答案:

答案 0 :(得分:2)

要使@Transactional工作,标记为@Transactional的方法应该由spring proxy调用。 Spring会做start/commit/rollback工作。因此,如果您使用@Subscribe添加注释,则可能无效。 (不确定,我应该测试或深入挖掘。)

但是您可以在订阅服务器中注入服务对象,并在处理函数中调用该服务的Transactional函数。