Java 冬眠+;Spring会话工厂配置

Java 冬眠+;Spring会话工厂配置,java,spring,hibernate,sessionfactory,Java,Spring,Hibernate,Sessionfactory,配置SessionFactory的正确方法是什么 如果我这样做: <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" p:dataSource-ref="dataSource"

配置SessionFactory的正确方法是什么

如果我这样做:

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
             p:dataSource-ref="dataSource"
             p:packagesToScan="ua.com.javer.flowerexpert"/>

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"
            p:sessionFactory-ref="sessionFactory" />
如果我改为
注释SessionFactoryBean

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
             p:dataSource-ref="dataSource"
             p:packagesToScan="ua.com.javer.flowerexpert"/>
即使在一些较旧的项目中,
hibernate3.annotation.AnnotationSessionFactoryBean
也可以正常工作

My
pom.xml
包含:

        <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.1.Final</version>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate.javax.persistence</groupId>
                <artifactId>hibernate-jpa-2.1-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.0.1.Final</version>
    </dependency>

    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>

org.hibernate
冬眠核心
5.0.1.最终版本
org.hibernate.javax.persistence
hibernate-jpa-2.1-api
org.hibernate
休眠实体管理器
5.0.1.最终版本
c3p0
c3p0
0.9.1.2
org.springframework
春季甲虫
${spring.version}
这是我的服务课程:

@Service("colorsService")
@Transactional
public class ColorsService {
@Autowired
private ColorDao colorDao;

public List<Color> getAllColors() {
    return colorDao.getAllColors();
}
}
@Service(“colorsService”)
@交易的
公共类颜色服务{
@自动连线
私人色彩刀;
公共列表getAllColors(){
返回colorDao.getAllColors();
}
}
这是道:

@Component
@Repository("colorDao")
public class ColorDaoHibernate implements ColorDao {

@Autowired
private SessionFactory sessionFactory;

public ColorDaoHibernate() {
}

@Override
public List<Color> getAllColors() {
    Session session = sessionFactory.getCurrentSession();
// StatelessSession session = sessionFactory.openStatelessSession();
    Query query = session.createQuery("FROM Color");
    return  query.list();
}
}
@组件
@存储库(“colorDao”)
公共类ColorDaoHibernate实现ColorDao{
@自动连线
私人会话工厂会话工厂;
public-hibernate(){
}
@凌驾
公共列表getAllColors(){
Session Session=sessionFactory.getCurrentSession();
//无状态会话=sessionFactory.openStatelessSession();
Query=session.createQuery(“从颜色”);
返回query.list();
}
}
注意:

如果我使用
sessionFactory.openstatesession()hibernate5。会话配置中的LocalSessionFactoryBean
不会导致问题

但关键是-我想使用
sessionFactory.getCurrentSession()
如何实现这一点?

希望您在spring配置文件中启用了支持。如果没有,请使用

另外,声明
transactionManager
,如下所示:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
并将其添加到
ColorDaoHibernate

@Repository("colorDao")
public class ColorDaoHibernate implements ColorDao {

@Autowired
private SessionFactory sessionFactory;

public ColorDaoHibernate() {
}
@Transactional
@Override
public List<Color> getAllColors() {
    Session session = sessionFactory.getCurrentSession();
// StatelessSession session = sessionFactory.openStatelessSession();
    Query query = session.createQuery("FROM Color");
    return  query.list();
}
}

好的,问题解决了

在我的
mvc dispatcher servlet.xml中,我有:

    <context:component-scan base-package="ua.com.javer.flowerexpert" />

只扫描
ua.com.javer.flowerexpert.controller
包(而不是dao)。现在它开始工作了。

添加了hibernateProps-得到了一个新的异常:
org.hibernate.HibernateException:createQuery在没有活动事务的情况下无效
,我有一个mvc-dispatcher-servlet.xml文件。谢谢,@arbit!问题解决了。我现在就给你答案
@Service("colorsService")
public class ColorsService {
@Autowired
private ColorDao colorDao;

public List<Color> getAllColors() {
    return colorDao.getAllColors();
}
}
@Repository("colorDao")
public class ColorDaoHibernate implements ColorDao {

@Autowired
private SessionFactory sessionFactory;

public ColorDaoHibernate() {
}
@Transactional
@Override
public List<Color> getAllColors() {
    Session session = sessionFactory.getCurrentSession();
// StatelessSession session = sessionFactory.openStatelessSession();
    Query query = session.createQuery("FROM Color");
    return  query.list();
}
}
<bean id="hibernateProps"
                class="org.springframework.beans.factory.config.PropertiesFactoryBean">
                <property name="properties">
                    <props>
                        <prop key="hibernate.current_session_context_class">thread</prop>
                    </props>
                </property>
            </bean>

    <bean id="sessionFactory"
                class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
                p:dataSource-ref="dataSource" p:packagesToScan="ua.com.javer.flowerexpert"
                p:hibernateProperties-ref="hibernateProps" />
    <context:component-scan base-package="ua.com.javer.flowerexpert" />
<context:component-scan base-package="ua.com.javer.flowerexpert.dao"/>
    <context:component-scan base-package="ua.com.javer.flowerexpert.controller" />