Reputation: 2166
I am trying to migrate a hibernate defined object model to DDL using hibernate. This is similar to the code first approach with Entity-framework Little snippet of my actual main function in intelliJ
I have the persistence.xml
file defined as below:
<?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>
I have the following class with the main method to actually make the whole thing work.
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
Upvotes: 0
Views: 327
Reputation: 13041
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.
Upvotes: 2