我是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.
答案 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)
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
这是配置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