'hibernate.dialect'即使在属性中设置后也未设置

时间:2018-06-01 09:45:23

标签: spring postgresql hibernate

我是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

请帮助我,我浪费了一周的时间尝试在许多网站上提供的一些解决方法,但没有对我有用

1 个答案:

答案 0 :(得分:0)

您的问题是您如何创建SessionFactory

如果您的spring-boot应用程序在类路径上有spring-boot-autoconfigure,那么您需要确保的是,您还拥有Hibernate以及类路径上所有必需的依赖项,以便它自动创建一个EntityManagerFactorySessionFactory bean。这全部由spring-boot-autoconfigure处理,如果您需要自定义默认行为,请参阅其文档。

如果您的spring-boot应用程序在类路径中不包含spring-boot-autoconfigure,那么您需要在春天手动配置必要的EntityManagerFactorySessionFactory bean组态;再次,春季文档非常广泛地涵盖了这一点。

在基于spring的应用程序中,这里确实没有你的HibernateUtil课程,这是问题的症结所在。 Spring的依赖注入可以根据需要为你的类提供适当的EntityManagerSessionFactory实例,尽管我通常建议在这里使用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课程可以删除,因为它完全没必要。