【问题标题】:Hibernate object model to DDL migrationHibernate 对象模型到 DDL 迁移
【发布时间】:2021-01-21 21:01:34
【问题描述】:

我正在尝试使用休眠将休眠定义的对象模型迁移到 DDL。这类似于使用实体框架的代码优先方法 我在intelliJ中的实际主要功能的小sn-p

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

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

    Hibernate 没有方言 org.hibernate.dialect.MySQL8InnoDBDialect。 它已弃用具有以下注释的 org.hibernate.dialect.MySQLInnoDBDialect 方言:

    @deprecated 改用“hibernate.dialect.storage_engine=innodb”环境变量或 JVM 系统属性。

    所以,尝试使用:

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

    而不是

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

    编辑

    首先,您的“persistence.xml”实际上是hibernate.cfg.xml hibernate 配置文件。我建议您通过以下方式更正此文件:

    <?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>
    

    然后按以下方式使用此配置:

    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);
    

    请注意Configurationsemi-deprecated。所以,我不建议使用它。

    【讨论】:

    • 我已经评论了该部分,因为我更喜欢使用持久性,.XML 文件来代替
    • 谢谢,它解决了我的问题。有时,休眠看起来像是过时的旧技术。实体框架更直接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2018-04-07
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多