首页 > 解决方案 > Hibernate 对象模型到 DDL 迁移

问题描述

我正在尝试使用休眠将休眠定义的对象模型迁移到 DDL。这类似于使用实体框架的代码优先方法我在 intelliJ 中的实际主要功能的小片段 在此处输入图像描述

我的persistence.xml文件定义如下:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="connection.url">jdbc:mysql://localhost:3306/testbd</property>
    <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

    <!-- <property name="connection.username"/> -->
    <!-- <property name="connection.password"/> -->

    <!-- DB schema will be updated if needed -->
    <property name="hibernate.hbm2ddl.auto">create</property>
      <mapping class="xx.xxx.xxx.xxx.xxx"/>
      <mapping class="xx.xxx.xxx.xxx.xxx"/>
      <mapping class="xx.xxx.xxx.xxx.xxx"/>
      <mapping class="xx.xxx.xxx.xxx.xxx"/>
      <mapping class="xx.xxx.xxx.xxx.xxx"/>
      <mapping class="xx.xxx.xxx.xxx.xxx"/>
   </session-factory>
</hibernate-configuration>

我有以下带有主要方法的类来实际使整个工作正常进行。

    public static void main(String[] args){

        // get configuration is not available (marked in red in intelliJ)
        Configuration configuration = Configuration.getConfiguration().configure("persistence.xml");
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        SessionFactory factory = configuration.buildSessionFactory(builder.build());


       //This commented section worked but I keep getting the below exception 
       /* Map<String, String> settings = new HashMap<>();
        settings.put("connection.driver_class", "com.mysql.jdbc.Driver");
        settings.put("dialect", "org.hibernate.dialect.MySQL8InnoDBDialect");
        settings.put("hibernate.connection.url", "jdbc:mysql://localhost:3306/juju_hibernate?useSSL=false");
        settings.put("hibernate.connection.username", "juju");
        settings.put("hibernate.connection.password", "iBrand2008");
        settings.put("hibernate.hbm2ddl.auto", "create");
        settings.put("show_sql", "true");

        MetadataSources metadata = new MetadataSources(
                new StandardServiceRegistryBuilder()
                        .applySettings(settings)
                        .build());
        metadata.addAnnotatedClass(ClickEntity.class);
        metadata.addAnnotatedClass(ClientAccessTokenEntity.class);
        metadata.addAnnotatedClass(ClientEntity.class);
        metadata.addAnnotatedClass(DeviceEntity.class);
        metadata.addAnnotatedClass(DeviceRespondentInformationEntity.class);
        metadata.addAnnotatedClass(DynamicDataEntity.class);
        metadata.addAnnotatedClass(DynamicDataValuesEntity.class);
        metadata.addAnnotatedClass(DynamicResponseEntity.class);
        metadata.addAnnotatedClass(EmailOpenedEntity.class);
        metadata.addAnnotatedClass(LoggerEntity.class);
        metadata.addAnnotatedClass(PostSyncActionCompletedEntity.class);
        metadata.addAnnotatedClass(PostSyncActionEntity.class);
        metadata.addAnnotatedClass(PostSyncToExecuteEntity.class);
        metadata.addAnnotatedClass(ProjectEntity.class);
        metadata.addAnnotatedClass(QuestionnaireEntity.class);
        metadata.addAnnotatedClass(RespondentEntity.class);
        metadata.addAnnotatedClass(RespondentTokenEntity.class);
        metadata.addAnnotatedClass(RespondentUniqueIdentiferEntity.class);
        metadata.addAnnotatedClass(RespondentEntity.class);
        metadata.addAnnotatedClass(ResponseEntity.class);
        metadata.addAnnotatedClass(RightEntity.class);
        metadata.addAnnotatedClass(RoleEntity.class);
        metadata.addAnnotatedClass(StatusEntity.class);
        metadata.addAnnotatedClass(TagEntity.class);
        metadata.addAnnotatedClass(TagProjectEntity.class);
        metadata.addAnnotatedClass(TerminalEntity.class);
        metadata.addAnnotatedClass(UserEntity.class);

        SchemaExport schemaExport = new SchemaExport();
        schemaExport.setHaltOnError(true);
        schemaExport.setFormat(true);
        schemaExport.setDelimiter(";");
        schemaExport.setOutputFile("db-schema.sql");
        schemaExport.createOnly(EnumSet.of(TargetType.SCRIPT),metadata.buildMetadata());*/
    }
Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:116)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionCreator.makeConnection(DriverManagerConnectionCreator.java:37)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:331)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:250)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:228)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:369)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:98)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:73)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:176)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84)
    at org.hibernate.boot.MetadataSources.buildMetadata(MetadataSources.java:185)
    at com.nomadlogic.juju.databse.DatabaseMigration.main(DatabaseMigration.java:68)
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

标签: javahibernatehibernate-mapping

解决方案


Hibernate does not have dialect org.hibernate.dialect.MySQL8InnoDBDialect. It has deprecated org.hibernate.dialect.MySQLInnoDBDialect dialect that has the following note:

@deprecated Use "hibernate.dialect.storage_engine=innodb" environment variable or JVM system property instead.

So, try to use:

settings.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
settings.put("hibernate.dialect.storage_engine", "innodb");

instead of

settings.put("dialect", "org.hibernate.dialect.MySQL8InnoDBDialect");

EDIT:

First of all your "persistence.xml" is actually the hibernate.cfg.xml hibernate config file. I would suggest you to correct this file in the following way:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>

        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
        <property name="hibernate.dialect.storage_engine">innodb</property>

        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testbd</property>
        
       
        <property name="hibernate.connection.username">your_user</property>
        <property name="hibernate.connection.password">your_pass</property>
 
        <property name="hibernate.hbm2ddl.auto">create</property>

      
        <mapping class="xx.xxx.xxx.xxx.xxx"/>
        <mapping class="xx.xxx.xxx.xxx.xxx"/>
        <!-- ... -->
    </session-factory>
</hibernate-configuration>

and then use this config in the following way:

import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

// ...

StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
Metadata meta = new MetadataSources(ssr).getMetadataBuilder().build();
      
SchemaExport schemaExport = new SchemaExport();
schemaExport.setHaltOnError(true);
schemaExport.setFormat(true);
schemaExport.setDelimiter(";");
schemaExport.setOutputFile("db-schema.sql");
schemaExport.createOnly(EnumSet.of(TargetType.SCRIPT), meta);

Please note that Configuration is semi-deprecated. So, I would not suggest to use it.


推荐阅读