我有一个简单的实体 - 团队,具有名称和评级属性(或者更多)。 假设我需要按多个标准查询我的团队。 因此,我不是在我的服务中添加多个带有'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
但没有运气。
谢谢,