使用hibernate3和spring3自动连接sessionbean [英] autowiring sessionbean with hibernate3 and spring3

查看:77
本文介绍了使用hibernate3和spring3自动连接sessionbean的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

道歉,因为我对Spring比较陌生。我有以下代码...



org.assessme.com.dao.UserDAOImpl.java

  @Repository 
public class UserDAOImpl implements UserDAO {


@Autowired
private SessionFactory sessionFactory;


@Transactional
public User getById(Long id){
return(User)sessionFactory.getCurrentSession()。load(User.class,id);
}

}

这个使用org.assessme.com .dao.UserDAO.java

  public interface UserDAO {
public User getById(Long id);
}

当我尝试运行我的程序时,我得到...

  ERROR:org.springframework.web.servlet.DispatcherServlet  - 上下文初始化失败
org.springframework.beans.factory.BeanCreationException:创建名为'userDAOImpl'的bean时出错:注入自动装配的依赖关系失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装入字段:private org.hibernate.SessionFactory org.assessme.com.bean.UserDAOImpl.sessionFactory;嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到符合依赖关系的[org.hibernate.SessionFactory]类型的匹配bean:期望至少1个符合此依赖关系自动装配候选资格的bean。依赖注释:在@ org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)$ b $ {@ org.springframework.beans.factory.annotation.Autowired(required = true)}

。在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory .support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory .support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext .refresh(AbstractApplicationContext.java:464)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet的.java:588)在org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645 $ b $二)
在org.springframework.web.servlet.Framewo
在org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
在org.springframework.web.servlet.HttpServletBean.init( HttpServletBean.java:133)
at javax.servlet.GenericServlet.init(GenericServlet.java:160)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1266)$ b在org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1185)
$ b在org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080)
。在组织.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5015)
在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5302)
在org.apache.catalina .util.LifecycleBase.start(LifecycleBase.java:150)
在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1566)
在org.apache.catalina.core .Cont ainerBase $ StartChild.call(ContainerBase.java:1556)
at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run( FutureTask.java:166)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:603

at java.lang.Thread.run(Thread.java:722)

我的春天.xml是...

 <?xml version =1.0encoding =UTF-8?> 
< beans xmlns =http://www.springframework.org/schema/beans
xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xmlns:tx =http://www.springframework.org/schema/tx
xmlns:context =http://www.springframework.org/schema/context

xsi:schemaLocation =
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/上下文http://www.springframework.org/schema/context/spring-context-3.0.xsd\">

< bean id =dataSourceclass =org.springframework.jdbc.datasource.DriverManagerDataSource>
< property name =driverClassNamevalue =com.mysql.jdbc.Driver/>
< property name =urlvalue =jdbc:mysql:// localhost / db/>
< property name =usernamevalue =username/>
< property name =passwordvalue =password/>
< / bean>

< bean id =sessionFactoryclass =org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean>
< property name =annotatedClasses>
< list>
< value> org.assessme.com.entity.User< / value>
< / list>
< / property>
< property name =dataSourceref =dataSource/>
< property name =packagesToScanvalue =data/>
< property name =hibernateProperties>
<道具>
< prop key =hibernate.dialect> org.hibernate.dialect.H2Dialect< / prop>
< prop key =hibernate.current_session_context_class> thread< / prop>
< prop key =hibernate.transaction.factory_class> org.hibernate.transaction.JDBCTransactionFactory< / prop>
< prop key =hibernate.show_sql> true< / prop>
< prop key =hibernate.hbm2ddl.auto> update< / prop>
< /道具>
< / property>
< / bean>

< context:component-scan base-package =org.assessme/>

< tx:annotation-driven />

< bean id =transactionManagerclass =org.springframework.orm.hibernate3.HibernateTransactionManager>
< property name =sessionFactoryref =sessionFactory/>
< / bean>

< / beans>

任何人都可以看到我做错了吗?我不太清楚如何自动装载sessionFactory。



我的实体类如下...



org.assessme.com.entity.User.java

  @Entity 
@Table(name =users )
public class User {

@Column(name =firstName)
private String firstName;

@Column(name =lastName)
private String lastName;

@Column(name =email)
private String email;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =id)
私人长ID;


public String getFirstName(){
return firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public String getLastName(){
return lastName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email = email;
}
public long getId(){
return id;
}
public void setId(long id){
this.id = id;




$ b

谢谢,

顺便说一下,我在springmvc中使用它,应该在servlet-context.xml中吗?

错误消息的相关部分:

  NoSuchBeanDefinitionException:没有匹配[org.hibernate.SessionFactory]类型的bean, 

问题是 AnnotationSessionFactoryBean 没有实现 org.hibernate.SessionFactory 接口。要获得需要调用 buildSessionFactory 方法。


Apologies as I'm relatively new to Spring. I have the following code...

org.assessme.com.dao.UserDAOImpl.java

@Repository
public class UserDAOImpl implements UserDAO{


    @Autowired
    private SessionFactory sessionFactory;


     @Transactional
    public User getById(Long id) {
        return (User) sessionFactory.getCurrentSession().load(User.class, id);
    }

}

This uses org.assessme.com.dao.UserDAO.java

public interface UserDAO {
    public User getById(Long id);
}

When I try to run my program, I get...

ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDAOImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory org.assessme.com.bean.UserDAOImpl.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
    at javax.servlet.GenericServlet.init(GenericServlet.java:160)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1266)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1185)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5015)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5302)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

My spring.xml is...

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation=
       "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
        <property name="url" value="jdbc:mysql://localhost/db" />
        <property name="username" value="username" />
        <property name="password" value="password" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="annotatedClasses">
        <list>
            <value>org.assessme.com.entity.User</value>
        </list>
    </property>
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="data" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
                <prop key="hibernate.current_session_context_class">thread</prop>
                <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <context:component-scan base-package="org.assessme" />

    <tx:annotation-driven/>

    <bean id="transactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

</beans>

Can anyone see what I'm doing incorrectly? I'm not quite sure how to autowire the sessionFactory.

My entity class is as follows...

org.assessme.com.entity.User.java

@Entity
@Table(name = "users")
public class User {

    @Column(name = "firstName")
    private String firstName;

    @Column(name = "lastName")
    private String lastName;

    @Column(name = "email")
    private String email;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private long id;


    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
}

Thanks,

I'm using this in springmvc by the way, should this be in servlet-context.xml?

解决方案

Here is the relevant part of the error message:

NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.SessionFactory]

The problem is AnnotationSessionFactoryBean does not implement the org.hibernate.SessionFactory interface. To get one of those you need to call the buildSessionFactory method.

这篇关于使用hibernate3和spring3自动连接sessionbean的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆