我是hibernate的新手,创建了一个简单的hibernate应用程序,我正在尝试创建一个会话工厂对象,我的代码如下:
public class Hibernateutil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration()
.buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
这是我试图从工厂获取会话并尝试保存/提交实体的地方
@Repository
public class StudentRepository1 {
SessionFactory factory = Hibernateutil.getSessionFactory();
Session currentSession =factory.getCurrentSession();
//do something
}
application.yml文件:
# Details for our datasource
spring:
datasource:
url: jdbc:postgresql://localhost:5432/postgres
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
# Hibernate properties
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQL95Dialect
#current_session_context_class: thread
show-sql: false
hibernate.ddl-auto:
#application properties
application:
name: hibernate_demo
server:
port: 10091
和错误即将获得:
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) ~[hibernate-core-5.3.1.Final.jar:5.3.1.Final]
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54) ~[hibernate-core-5.3.1.Final.jar:5.3.1.Final]
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137) ~[hibernate-core-5.3.1.Final.jar:5.3.1.Final]
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.3.1.Final.jar:5.3.1.Final]
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94) ~[hibernate-core-5.3.1.Final.jar:5.3.1.Final]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.3.1.Final.jar:5.3.1.Final]
... 39 common frames omitted`
我项目的依赖关系:
dependencies {
//compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '1.5.6.RELEASE'
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.3.1.Final'
compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.2.Final'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.9.RELEASE'
compile group: 'org.postgresql', name: 'postgresql', version: '42.2.2'
}
`
即时通讯使用postgres 9.5
请帮助我,我浪费了一周的时间尝试在许多网站上提供的一些解决方法,但没有对我有用
答案 0 :(得分:0)
您的问题是您如何创建SessionFactory
。
如果您的spring-boot
应用程序在类路径上有spring-boot-autoconfigure
,那么您需要确保的是,您还拥有Hibernate以及类路径上所有必需的依赖项,以便它自动创建一个EntityManagerFactory
或SessionFactory
bean。这全部由spring-boot-autoconfigure
处理,如果您需要自定义默认行为,请参阅其文档。
如果您的spring-boot
应用程序在类路径中不包含spring-boot-autoconfigure
,那么您需要在春天手动配置必要的EntityManagerFactory
或SessionFactory
bean组态;再次,春季文档非常广泛地涵盖了这一点。
在基于spring的应用程序中,这里确实没有你的HibernateUtil
课程,这是问题的症结所在。 Spring的依赖注入可以根据需要为你的类提供适当的EntityManager
或SessionFactory
实例,尽管我通常建议在这里使用JPA。
因此,在您的存储库类中,您可以执行此操作
@Repository
public class MyFancyRepositoryImpl implements MyFancyRepository {
@PersistenceContext
private EntityManager entityManager;
public void doSomethingCool(TheEntity entity) {
entityManager.persist( entity );
// should you need access to the raw Hibernate session, unwrap
final Session session = entityManager.unwrap( Session.class );
// now you can use the `Session` as needed/
}
}
这意味着您的HibernateUtil
课程可以删除,因为它完全没必要。