Hibernate,Spring,在非托管bean中查询会导致SessionException

时间:2014-10-31 11:30:42

标签: java spring hibernate spring-mvc

我有一个简单的实体 - 团队,具有名称和评级属性(或者更多)。 假设我需要按多个标准查询我的团队。 因此,我不是在我的服务中添加多个带有'findByXYZAndZYX'等签名的方法,而是添加以下方法:

Teams findTeams()

实施代码段:

@Autowired private SessionFactory sessionFactory;
...
@Override
public Teams getTeams() {
    return new HibernateTeams(sessionFactory);
}

现在,团队界面:

public interface Teams extends Iterable<Team> {

    Teams withNameContaining(String name);
    Teams withRatingGreaterThan(Integer rating);
}

和特定于hibernate的实现:

public class HibernateTeams implements Teams {

    private static final String NAME_PROPERTY = "name";
    private static final String RATING_PROPERTY = "rating";

    private SessionFactory sessionFactory;

    private Criteria criteria;

    public HibernateTeams(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
        criteria = getRootCriteria();
    }

    private Criteria getRootCriteria() {
        return getCurrentSession().createCriteria(Team.class);
    }

    @Override
    public HibernateTeams withNameContaining(String name) {
        criteria.add(Restrictions.like(NAME_PROPERTY, name));
        return this;
    }

    @Override
    public Teams withRatingGreaterThan(Integer rating) {
        criteria.add(Restrictions.gt(RATING_PROPERTY, rating));
        return this;
    }

    @Override
    public Iterator<Team> iterator() {
        @SuppressWarnings("unchecked")
        Collection<Team> result = criteria.list();
        return result.iterator();
    }

    private Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }
}

但是现在,在客户端代码中使用它:

teamService
.getTeams()
.withNameContaining("someTeamName")
.withRatingGreaterThan(15)

我有一个SessionException

org.hibernate.SessionException: Session is closed

我认为这是因为将sessionFactory传递给非托管类。

所以这里有几个问题:

1)有可能按照我写的方式这样做吗?我尝试使用Transactional或者某些东西来注释我的HibernateTeams,但它没有帮助。

2)如果我需要创建我的HibernateTeams spring-managed-bean并可能将SessionFactory注入其中,我该怎么做?我已经试过了 @Component @Scope("prototype")@Configurable 但没有运气。

谢谢,

0 个答案:

没有答案