考虑在配置中定义类型为'org.hibernate.SessionFactory'的bean

时间:2017-07-15 17:09:01

标签: java spring hibernate

我是JavaEE的新手,我一直在研究一个simlpe Springboot项目。 每次我运行它我都会收到此错误:

请随时回答我的问题,代码中的任何改进都是高度赞赏的。

Field sessionFactory in com.example.dao.CartDaoImpl required a bean of type 'org.hibernate.SessionFactory' that could not be found.

Action:

Consider defining a bean of type 'org.hibernate.SessionFactory' in your configuration.

5 个答案:

答案 0 :(得分:5)

可以从已在spring-boot-starter-data-jpa中配置的EntityManager获取会话。因此注入EntityManager而不是SessionFactory:

    @Autowired
    private EntityManager entityManager;

    private Session getSession() {
        return entityManager.unwrap(Session.class);
    }

并在需要的地方使用getSession()方法。

答案 1 :(得分:0)

我看到你的项目,我发现项目中SessionFactory没有SessionFactory类或配置,而@Autowired使用SessionFactory CartDaoImpl clas。这是主要问题。您需要配置SessionFactory

你可以参考下面的例子: http://www.devglan.com/spring-boot/spring-boot-hibernate-5-example

答案 2 :(得分:0)

  1. 你需要:
    • 在Application类中添加SessionFactory bean。
    • 在application.properties中添加Current Session Context类。
    • 使用@Autowired注释使用SessionFactory。
    • 添加到application.properties
  2. spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

    并添加此

    spring.datasource.url=......
    spring.datasource.username=....
    spring.datasource.password=.....
    spring.jpa.properties.hibernate.dialect=.......
    spring.jpa.hibernate.ddl-auto=update
    
    1. 你使用@Transactional,但你没有配置它。你也应该配置它。将@EnableTransactionManagement添加到config类并配置此bean。
    2. 这是配置A Guide to Hibernate with Spring 4

      的好例子

      请注意: 1#您在UserServiceImpl中使用#例如

      @Component
      @Service
      public class UserServiceImpl implements UserService {...
        ....
      }
      

      仅使用@Component或@Service,但不能同时使用两者,因为它是多余的。服务是一个组件。

      2#在你只阅读操作我们而不是默认@Transactional这个@Transactional(readOnly = true)

      的方法中

      3# 在像void addCustomerOrder(CustomerOrder customerOrder);这样的方法中,更好地返回布尔值或像CustomerOrder这样的对象,而不仅仅返回void。

      4#class Queries不可序列化

      5#最好使用lazy作为默认值,而不是fetch = FetchType.EAGER

      6#dao class CartDaoImpl依赖于服务类,这很奇怪。

      7#在某些情况下,您在服务上的另一个级别进行交易

      8#如果你可以创建子包impl并将所有实现移动到一个。

      你将使用带有N个接口的com.dao和带有N个实现的com.dao.impl,而不是一个带有N + N个interxases和类的包com.dao

      将其添加到pom.xml

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
      

      并创建包配置com.configs并配置为DatabaseConfig

答案 3 :(得分:0)

创建服务并使用它从EntityManager中获取会话:

@Service
public class HibernateService {

    @PersistenceContext
    private EntityManager entityManager;

    public <R> NativeQuery<R> createNativeQuery(String sqlString, Class<R> resultClass) {
        return getSession().createNativeQuery(sqlString, resultClass);
    }

    public NativeQuery createNativeQuery(String sqlString) {
        return getSession().createNativeQuery(sqlString);
    }

    public Session getSession() {
        return entityManager.unwrap(Session.class);
    }
}

您可以添加更多方法来减少编写代码的数量。

答案 4 :(得分:0)

使用Hibernate 5简单检​​查以下内容

-检查基本软件包是否已扫描(HibernateConfig.java)

-检查文件中的有效注释 @组态 @EnableTransactionManagement

-检查是否创建了所有有效的bean LocalSessionFactoryBean,HibernateTransactionManager,HibernateTemplate