hibernate.dialect не устанавливается даже после установки его в свойствах - PullRequest
0 голосов
/ 01 июня 2018

Я новичок в 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 голосов
/ 02 июня 2018

Ваша проблема в том, как вы создаете SessionFactory.

Если ваше spring-boot приложение имеет spring-boot-autoconfigure на пути к классам, то все, что вам нужно, это убедиться, что у вас есть Hibernate и все необходимые зависимости на пути к классам, чтобы оно автоматически создавалоEntityManagerFactory или SessionFactory боб.Все это обрабатывается spring-boot-autoconfigure, см. Его документацию, если вам нужно настроить поведение по умолчанию.

Если ваше приложение spring-boot не включает spring-boot-autoconfigure в пути к классам, вам придется вручнуюсконфигурируйте необходимые компоненты EntityManagerFactory или SessionFactory в своей конфигурации 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 может быть удален как совершенно ненужный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...