Java 无法自动连接字段:private org.hibernate.SessionFactory hibernate和Spring

Java 无法自动连接字段:private org.hibernate.SessionFactory hibernate和Spring,java,spring,hibernate,autowired,Java,Spring,Hibernate,Autowired,在我的服务器Tomcat上部署项目后,我遇到了这个错误。我发现了许多类似的问题,但我没有找到问题的答案 org.springframework.beans.factory.BeanCreationException:创建名为“categoryDaodImpl”的bean时出错:自动关联依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动关联字段:private org.hibernate.Sessio

在我的服务器Tomcat上部署项目后,我遇到了这个错误。我发现了许多类似的问题,但我没有找到问题的答案

org.springframework.beans.factory.BeanCreationException:创建名为“categoryDaodImpl”的bean时出错:自动关联依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动关联字段:private org.hibernate.SessionFactory ua.com.goit.gojava7.kikstarter.dao.database.CategoryDaoDbImpl.SessionFactory;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“sessionFactory”的bean时出错,该bean在类路径资源[applicationContext.xml]中定义:调用init方法失败;嵌套异常为org.hibernate.AnnotationException:@OneToOne或@ManyToOne on ua.com.goit.gojava7.kikstarter.domain.Payment.projectId引用未知实体:int 位于org.springframework.beans.factory.annotation.AutoWiredNotationBeanPostProcessor.postProcessPropertyValues(AutoWiredNotationBeanPostProcessor.java:334) 位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) 位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) 位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) 位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:772) 位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835) 位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) 位于org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) 位于org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) 位于org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)

applicationContext.xml

<?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:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx    
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.2.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util.xsd">

    <context:property-placeholder location="classpath:config.properties" />
    <context:component-scan base-package="ua.com.goit.gojava7.kikstarter.dao.database" />

    <bean id="basicDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.dataBaseUrl}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

        <property name="dataSource">
            <ref bean="basicDataSource" />
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show_sql">false</prop>
            </props>
        </property>

        <property name="annotatedClasses">
            <list>
                <value>ua.com.goit.gojava7.kikstarter.domain.Quote</value>
                <value>ua.com.goit.gojava7.kikstarter.domain.Category</value>
                <value>ua.com.goit.gojava7.kikstarter.domain.Project</value>
                <value>ua.com.goit.gojava7.kikstarter.domain.Payment</value>
                <value>ua.com.goit.gojava7.kikstarter.domain.Reward</value>
            </list>
        </property>
    </bean>

这对评论来说太长了,根据你的评论,我认为给你一个更长的解释可能会有所帮助

在阅读Java异常时,有几件事需要记住

  • 。通过向堆栈添加“帧”来跟踪代码执行。每次调用方法时,都会将一个新帧“推”到堆栈上。这就是当抛出异常时,如何获取导致异常的调用方法(称为
  • 。在Java中,当抛出异常时,可以指定异常的“原因”。这是一种跟踪引发新异常的异常堆栈跟踪的方法
  • Spring框架因大量使用链式异常而臭名昭著(我个人认为这是一个很好的质量),这使得读取框架返回的错误有点棘手。使它变得棘手的是堆栈跟踪的顺序和链式异常的顺序基本上是反向的

    也就是说,对于堆栈跟踪,最近执行的代码位于顶部。但是,对于链式异常,抛出的“第一个”异常位于底部

    因此,您需要做的是查找抛出的“第一个”异常,以找到异常的真正根本原因并修复该异常。已经有一个很好的问题/答案,所以这就是我所说的

    因此,看看您的具体示例(并将其简化为需要注意的结构),我们看到:

    当您看到嵌套异常为时,您正在处理链式异常。因此,您实际遇到的是一个导致您的问题的异常,这是您的
    支付
    对象上的映射问题;特别是
    projectId
    字段

    所以当你问

    如何处理无法自动连接字段:private org.hibernate.SessionFactory和创建名为“categoryDaoDbImpl”的bean时出错我必须在applicationContext.xml文件中创建名为“categoryDaoDbImpl”的bean


    希望现在很清楚,您不必对“前”三个
    BeanCreationException
    做任何事情,因为这些都是由根
    注释异常引起的
    这对注释来说太长了,根据您的注释,我想这可能有助于给您一个更长的解释

    在阅读Java异常时,有几件事需要记住

  • 。通过向堆栈添加“帧”来跟踪代码执行。每次调用方法时,都会将一个新帧“推”到堆栈上。这就是当抛出异常时,如何获取导致异常的调用方法(称为
  • 。在Java中,当抛出异常时,可以指定异常的“原因”。这是一种跟踪引发新异常的异常堆栈跟踪的方法
  • Spring框架因大量使用链式异常而臭名昭著
    package ua.com.goit.gojava7.kikstarter.dao.database;
    
    import java.util.List;
    
    import org.hibernate.SessionFactory;
    import org.hibernate.Session;
    import org.hibernate.criterion.Restrictions;
    import org.hibernate.Criteria;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Repository;
    import org.springframework.transaction.annotation.Transactional;
    
    import ua.com.goit.gojava7.kikstarter.dao.CategoryDao;
    import ua.com.goit.gojava7.kikstarter.domain.Category;
    
    @Repository
    public class CategoryDaoDbImpl implements CategoryDao {
    
        @Autowired
        private SessionFactory sessionFactory;
    
        @SuppressWarnings("unchecked")
        @Transactional
        @Override
        public List<Category> getAll() {
            Session session=sessionFactory.openSession();
    
            Criteria criteria=session.createCriteria(Category.class);
            List<Category> categories=criteria.list();
    
            session.close();
            return categories;
        }
    
        @Transactional
        @Override
        public Category getCategory(int id) {
            Session session=sessionFactory.openSession();
    
            Criteria criteria=session.createCriteria(Category.class);
            criteria.add(Restrictions.eq("id", id));
            Category category=(Category) criteria.uniqueResult();
    
            session.close();
            return category;
        }
    }
    
    package ua.com.goit.gojava7.kikstarter.domain;
    
    import java.util.Set;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.SequenceGenerator;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "categories")
    public class Category {
    
        @Id
        @SequenceGenerator(name = "SEQ_GEN", sequenceName = "seq_id", allocationSize = 10)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
        private int id;
    
        @Column(name = "name")
        private String name;
    
        @OneToMany
        private Set<Project> projects;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public Set<Project> getProjects() {
            return projects;
        }
    
        public void setProjects(Set<Project> projects) {
            this.projects = projects;
        }
    
        @Override
        public String toString() {
            return "ID: " + id + "; Name: " + name;
        }
    }
    
    package ua.com.goit.gojava7.kikstarter.domain;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.SequenceGenerator;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "projects")
    public class Project {
    
        @Id
        @SequenceGenerator(name = "SEQ_GEN", sequenceName = "seq_id", allocationSize = 10)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
        private int id;
    
        @ManyToOne
        @JoinColumn(name = "category_id")
        private Category category;
    
        @Column(name = "name")
        private String name;
    
        @Column(name = "general_description")
        private String generalDescription;
    
        @Column(name = "full_description")
        private String fullDescription;
    
        @Column(name = "video_link")
        private String videoLink;
    
        @Column(name = "required_sum")
        private int requiredSum;
    
        @Column(name = "collected_sum")
        private int collectedSum;
    
        @Column(name = "days_left")
        private int endOfDays;
    
        public int getId() {
            return id;
        }
    
        public Category getCategory() {
            return category;
        }
    
        public String getName() {
            return name;
        }
    
        public String getGenerelDescription() {
            return generalDescription;
        }
    
        public String getFullDescription() {
            return fullDescription;
        }
    
        public String getVideoLink() {
            return videoLink;
        }
    
        public int getRequiredSum() {
            return requiredSum;
        }
    
        public int getCollectedSum() {
            return collectedSum;
        }
    
        public int getEndOfDays() {
            return endOfDays;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public void setCategory(Category category) {
            this.category = category;
        }
    
        public void setName(String projectName) {
            this.name = projectName;
        }
    
        public void setGeneralDescription(String generalDescription) {
            this.generalDescription = generalDescription;
        }
    
        public void setFullDescription(String fullDescription) {
            this.fullDescription = fullDescription;
        }
    
        public void setVideoLink(String videoLink) {
            this.videoLink = videoLink;
        }
    
        public void setRequiredSum(int requiredSum) {
            this.requiredSum = requiredSum;
        }
    
        public void setCollectedSum(int collectedAmount) {
            this.collectedSum = collectedAmount;
        }
    
        public void setSumFromUser(int enteredAmount) {
            collectedSum += enteredAmount;
        }
    
        public void setEndOfDays(int endOfDays) {
            this.endOfDays = endOfDays;
        }
    
        @Override
        public String toString() {
            return "Project: name: " + name + "; general description: " + generalDescription + "; full description: "
                + fullDescription + "; video link: " + videoLink + "; required sum: " + requiredSum
                + "; collected sum: " + collectedSum + "; days left: " + endOfDays;
        }
    }
    
    BeanCreationException: Error creating bean with name 'categoryDaoDbImpl': Injection of autowired dependencies failed; **nested exception is**
    |
    |-> BeanCreationException: Could not autowire field: private SessionFactory CategoryDaoDbImpl.sessionFactory; **nested exception is**
        |
        |-> BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; **nested exception is**
            |
            |-> AnnotationException: @OneToOne or @ManyToOne on Payment.projectId references an unknown entity: int at
                    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at 
                    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at
                    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) at 
                    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at 
                    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) at 
                    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at 
                    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) at 
                    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) at 
                    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) at 
                    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835) at 
                    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) at 
                    org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) at 
                    org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) at 
                    org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)