org.hibernate.HibernateException: toegang tot DialectResolutionInfo kan niet nul zijn als ‘hibernate.dialect’ niet is ingesteld

Ik probeer een spring-boot-toepassing uit te voeren die hibernate gebruikt via spring-jpa, maar ik krijg deze foutmelding:

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:104)
        at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:71)
        at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:205)
        at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
        at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
        at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
        ... 21 more

mijn pom.xml-bestand is dit:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.8.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
       </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
    </dependency>
</dependencies>

mijn slaapstandconfiguratie is dat (de dialectconfiguratie bevindt zich in de laatste methode van deze klasse):

@Configuration
@EnableTransactionManagement
@ComponentScan({ "com.spring.app" })
public class HibernateConfig {
   @Bean
   public LocalSessionFactoryBean sessionFactory() {
      LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
      sessionFactory.setDataSource(restDataSource());
      sessionFactory.setPackagesToScan(new String[] { "com.spring.app.model" });
      sessionFactory.setHibernateProperties(hibernateProperties());
      return sessionFactory;
   }
   @Bean
   public DataSource restDataSource() {
      BasicDataSource dataSource = new BasicDataSource();
      dataSource.setDriverClassName("org.postgresql.Driver");
      dataSource.setUrl("jdbc:postgresql://localhost:5432/teste?charSet=LATIN1");
      dataSource.setUsername("klebermo");
      dataSource.setPassword("123");
      return dataSource;
   }
   @Bean
   @Autowired
   public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
      HibernateTransactionManager txManager = new HibernateTransactionManager();
      txManager.setSessionFactory(sessionFactory);
      return txManager;
   }
   @Bean
   public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
      return new PersistenceExceptionTranslationPostProcessor();
   }
   Properties hibernateProperties() {
      return new Properties() {
         /**
         * 
         */
        private static final long serialVersionUID = 1L;
        {
            setProperty("hibernate.hbm2ddl.auto", "create");
            setProperty("hibernate.show_sql", "false");
            setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
         }
      };
   }
}

wat doe ik hier verkeerd?


Antwoord 1, autoriteit 100%

Verwijder eerst al uw configuratie Spring Boot zal het voor u starten.

Zorg ervoor dat u een application.propertiesin uw klassenpad heeft en voeg de volgende eigenschappen toe.

spring.datasource.url=jdbc:postgresql://localhost:5432/teste?charSet=LATIN1
spring.datasource.username=klebermo
spring.datasource.password=123
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create

Als je echt toegang nodig hebt tot een SessionFactoryen dat is eigenlijk voor dezelfde gegevensbron, dan kun je het volgende doen (wat ook is gedocumenteerd hierhoewel voor XML, niet JavaConfig).

@Configuration        
public class HibernateConfig {
    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    }
}

Op die manier heb je zowel een EntityManagerFactoryals een SessionFactory.

UPDATE:vanaf Hibernate 5 breidt SessionFactoryfeitelijk de EntityManagerFactoryuit. Dus om een ​​SessionFactoryte verkrijgen, kun je eenvoudig de EntityManagerFactoryernaar casten of de methode unwrapgebruiken om er een te krijgen.

public class SomeHibernateRepository {
  @PersistenceUnit
  private EntityManagerFactory emf;
  protected SessionFactory getSessionFactory() {
    return emf.unwrap(SessionFactory.class);
  }
}

Ervan uitgaande dat je een klasse hebt met een main-methode met @EnableAutoConfiguration, heb je de annotatie @EnableTransactionManagementniet nodig, want dat is wel zo ingeschakeld door Spring Boot voor u. Een basistoepassingsklasse in het pakket com.spring.appzou voldoende moeten zijn.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
} 

Zoiets zou voldoende moeten zijn om al je klassen (inclusief entiteiten en op Spring Data gebaseerde opslagplaatsen) te detecteren.

UPDATE:deze annotaties kunnen worden vervangen door een enkele @SpringBootApplicationin recentere versies van Spring Boot.

@SpringBootApplication
public class Application {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
} 

Ik zou ook willen voorstellen om de commons-dbcp-afhankelijkheid te verwijderen, omdat Spring Boot dan de snellere en robuustere HikariCPimplementatie.


Antwoord 2, autoriteit 79%

Ik had een soortgelijk probleem bij het opstarten van de applicatie (met Spring Boot) met de databaseserver uit.

Hibernate kan het juiste dialect bepalen om automatisch te gebruiken, maar om dit te doen, heeft het een live verbinding met de database nodig.


Antwoord 3, autoriteit 16%

voeg spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialectin het bestand application.properties


Antwoord 4, autoriteit 9%

Ik kreeg deze foutmelding toen mijn database niet werd aangemaakt. Na het handmatig aanmaken van de database werkte het prima.


Antwoord 5, autoriteit 7%

Ik heb ook met een soortgelijk probleem te maken gehad. Maar het was te wijten aan het verstrekte ongeldige wachtwoord. Ik zou ook willen zeggen dat je code ouderwetse code lijkt te zijn met lente. Je hebt al gezegd dat je springboot gebruikt, wat betekent dat de meeste dingen automatisch voor je worden geconfigureerd. hibernate-dialect wordt automatisch geselecteerd op basis van het DB-stuurprogramma dat beschikbaar is op het klassenpad, samen met geldige inloggegevens die kunnen worden gebruikt om de verbinding correct te testen. Als er een probleem is met de verbinding, krijgt u opnieuw dezelfde fout. slechts 3 eigenschappen nodig in application.properties

# Replace with your connection string
spring.datasource.url=jdbc:mysql://localhost:3306/pdb1
# Replace with your credentials
spring.datasource.username=root
spring.datasource.password=

Antwoord 6, autoriteit 4%

Ik kwam hetzelfde probleem tegen en mijn probleem was dat de database waarmee ik verbinding probeerde te maken niet bestond.

Ik heb de database gemaakt, de URL/verbindingsreeks geverifieerd en opnieuw uitgevoerd en alles werkte zoals verwacht.


Antwoord 7, autoriteit 3%

Ik had hetzelfde probleem. door dit toe te voegen aan de application.properties is het probleem opgelost:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

Antwoord 8, autoriteit 2%

Verwijder de redundante slaapstandconfiguratie

Als u Spring Boot gebruikt, hoeft u de JPA- en Hibernate-configuratie niet expliciet op te geven, aangezien Spring Boot dat voor u kan doen.

Databaseconfiguratie-eigenschappen toevoegen

In het application.propertiesSpring Boot-configuratiebestand heeft u de optie om uw databaseconfiguratie-eigenschappen toe te voegen:

spring.datasource.driverClassName = org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/teste
spring.datasource.username = klebermo
spring.datasource.password = 123

Hibernate-specifieke eigenschappen toevoegen

En in hetzelfde configuratiebestand application.propertieskunt u ook aangepaste Hibernate-eigenschappen instellen:

# Log SQL statements
spring.jpa.show-sql = false
# Hibernate ddl auto for generating the database schema
spring.jpa.hibernate.ddl-auto = create
# Hibernate database Dialect
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

Dat is het!


Antwoord 9, autoriteit 2%

In spring boot voor jpa java config moet je JpaBaseConfiguration uitbreiden en zijn abstracte methoden implementeren.

@Configuration
public class JpaConfig extends JpaBaseConfiguration {
    @Override
    protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        return vendorAdapter;
    }
    @Override
    protected Map<String, Object> getVendorProperties() {
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
    }
}

Antwoord 10, autoriteit 2%

dit gebeurt omdat uw code niet de moeite waard is om verbinding te maken met de database. Zorg ervoor dat u mysql-stuurprogramma en gebruikersnaam en wachtwoord correct hebt.


Antwoord 11, autoriteit 2%

Zorg ervoor dat uw application.propertiesalle juiste informatie heeft: (ik heb mijn db-poort gewijzigd van 8889in 3306het werkte)

db.url: jdbc:mysql://localhost:3306/test

Antwoord 12, autoriteit 2%

Hier volgen enkele van de redenen waarom het probleem hibernate.dialectniet is ingesteld.
De meeste van deze uitzonderingen worden weergegeven in het opstartlogboek, dat uiteindelijk wordt gevolgd door het genoemde probleem.

Voorbeeld: In Spring boot-app met Postgres DB

1. Controleer of de database daadwerkelijk is geïnstalleerd en of de server is gestart.

  • org.postgresql.util.PSQLException: Verbinding met localhost:5432 geweigerd. Controleer of de hostnaam en poort correct zijn en of de postmaster TCP/IP-verbindingen accepteert.
  • java.net.ConnectException: Verbinding geweigerd: verbinden
  • org.hibernate.service.spi.ServiceException: kan gevraagde service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] niet maken

2. Controleer of de databasenaam correct is vermeld.

  • org.postgresql.util.PSQLException: FATAL: database “foo” bestaat niet

    In het bestand application.properties,

    spring.datasource.url = jdbc:postgresql://localhost:5432/foo
    

    maar foobestond niet.
    Dus ik heb de database gemaakt van pgAdmin voor postgres

    CREATE DATABASE foo;
    

3. Controleer of de hostnaam en serverpoort toegankelijk zijn.

  • org.postgresql.util.PSQLException: Verbinding met localhost:5431 geweigerd. Controleer of de hostnaam en poort correct zijn en of de postmaster TCP/IP-verbindingen accepteert.
  • java.net.ConnectException: Verbinding geweigerd: verbinden

4. Controleer of de databasegegevens correct zijn.

  • zoals @Pankaj al zei
  • org.postgresql.util.PSQLException: FATAL: wachtwoordverificatie mislukt voor gebruiker “postgres”

    spring.datasource.username= {DB USERNAME HERE}

    spring.datasource.password= {DB PASSWORD HERE}


Antwoord 13

In mijn geval kon de gebruiker geen verbinding maken met de database. Als hetzelfde probleem zal optreden als het logboek een waarschuwing bevat net voor de uitzondering:

WARN HHH000342: Could not obtain connection to query metadata : Login failed for user 'my_user'.

Antwoord 14

Zorg ervoor dat je je database in je pom hebt staan, zoals OP deed. Dat was mijn probleem.


Antwoord 15

Mijn probleem was dat de ingesloten database al was verbonden. nauwe verbinding


Antwoord 16

Ik kreeg dit probleem toen Eclipse het JDBC-stuurprogramma niet kon vinden. Moest een geleidelijke verversing van de zonsverduistering doen om dit werk te krijgen.


Antwoord 17

Als je deze regel gebruikt:

sessionFactory.getHibernateProperties().put("hibernate.dialect", env.getProperty("hibernate.dialect"));

zorg ervoor dat env.getProperty("hibernate.dialect")niet null is.


Antwoord 18

Hetzelfde, maar in een JBoss WildFly AS.

Opgelost met eigenschappen in mijn META-INF/persistence.xml

<properties>
            <property name="hibernate.transaction.jta.platform"
                value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
            <property name="spring.jpa.database-platform" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="spring.jpa.show-sql" value="false" />
</properties>

Antwoord 19

Voor degenen die met AWS MySQL RDS werken, kan het voorkomen dat u geen verbinding kunt maken met de database. Ga naar de instelling AWS-beveiligingsgroepen voor MySQL RDS en bewerk de inkomende IP-regel door MyIP te vernieuwen.

Ik heb met dit probleem te maken gehad en door het bovenstaande te doen, is het probleem voor mij opgelost.


Antwoord 20

Ik had dit probleem ook. In mijn geval was het omdat er geen subsidies waren toegewezen aan de MySQL-gebruiker. Door subsidies toe te wijzen aan MySQL-gebruiker die mijn app gebruikt, is het probleem opgelost:

grant select, insert, delete, update on my_db.* to 'my_user'@'%';

Antwoord 21

Ik had hetzelfde probleem en na het debuggen bleek dat Spring application.properties een verkeerd IP-adres had voor de DB-server

spring.datasource.url=jdbc:oracle:thin:@WRONG:1521/DEV

Antwoord 22

Het toevoegen van spring.jpa.database-platform=org.hibernate.dialect.MariaDB53Dialectaan mijn eigenschappenbestand werkte voor mij.

PS: ik gebruik MariaDB


Antwoord 23

Ik heb deze foutmelding in de volgende drie gevallen weergegeven:

  • Er bestaat geen databasegebruiker met gebruikersnaam geschreven in het bestand application.properties of persistence.properties of, zoals in uw geval, in het bestand HibernateConfig
  • De geïmplementeerde database heeft die gebruiker, maar de gebruiker wordt geïdentificeerd met een ander wachtwoord dan dat in een van de bovenstaande bestanden
  • De database heeft die gebruiker en de wachtwoorden komen overeen, maar die gebruiker heeft niet alle rechten die nodig zijn om alle databasetaken uit te voeren die uw spring-boot-app doet

De voor de hand liggende oplossing is om een ​​nieuwe databasegebruiker aan te maken met dezelfde gebruikersnaam en hetzelfde wachtwoord als in de spring-boot-app of de gebruikersnaam en het wachtwoord in uw spring-boot-app-bestanden te wijzigen zodat deze overeenkomen met een bestaande databasegebruiker en voldoende privileges toe te kennen aan die database gebruiker. In het geval van een MySQL-database kan dit als volgt worden gedaan:

mysql -u root -p 
>CREATE USER 'theuser'@'localhost' IDENTIFIED BY 'thepassword';
>GRANT ALL ON *.* to [email protected] IDENTIFIED BY 'thepassword';
>FLUSH PRIVILEGES;

Natuurlijk zijn er vergelijkbare commando’s in Postgresql, maar ik heb niet getest of in het geval van Postgresql deze foutmelding in deze drie gevallen kan worden gereproduceerd.


Antwoord 24

Het blijkt dat niemand set spring.jpa.database=mysqlvermeldt in het bestand application.properties, als je Spring JPA gebruikt. Dit is het eenvoudigste antwoord voor mij en ik wil deze vraag delen.


Antwoord 25

Ik had hetzelfde probleem en het werd veroorzaakt doordat ik geen verbinding kon maken met de database-instantie. Zoek naar hibernate-fout HHH000342 in het logboek boven die fout, het zou u een idee moeten geven waar de db-verbinding faalt (onjuiste gebruikersnaam/pas, url, enz.)


Antwoord 26

Dit overkwam mij omdat ik de conf.configure();niet had toegevoegd voordat ik aan de sessie begon:

Configuration conf = new Configuration();
conf.configure();

Antwoord 27

Zorg ervoor dat u geldige gegevens invoert in application.propertiesen of uw databaseserver beschikbaar is. Als u bijvoorbeeld verbinding maakt met MySQL, controleer dan of XAMPPcorrect werkt.


Antwoord 28

Ik had hetzelfde probleem: de db die ik probeerde te verbinden, bestond niet. Ik gebruikte jpa.database=default(wat volgens mij betekent dat het zal proberen verbinding te maken met de database en vervolgens automatisch het dialect selecteert). Toen ik de database eenmaal had gestart, werkte het prima zonder enige verandering.


Antwoord 29

Ik heb met dit probleem te maken gehad doordat de Mysql 8.0.11-versie terugging naar 5.7 en voor mij is opgelost


Antwoord 30

Ik had dezelfde fout nadat ik de slaapstandcode-generatie had gebruikt

https://www.mkyong. com/hibernate/hoe-code-genereren-met-hibernate-tools/

toen werd de hibernate.cfg.xmlaangemaakt in /src/main/java
maar zonder de verbindingsparameters
na het verwijderen – mijn probleem was opgelost

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes