Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- I'm new to developing web applications in general, and this is my first time trying to create one using Spring and Hibernate. I have gone through couple of tutorials and now I am starting to work on my own web application.
- I'm trying to setup Spring and Hibernate web application using pure java (no XML). I have set up Azure MySQL database and I want to connect hibernate to it.
- I have created AppConfig file in which I configure Hibernate and Spring, also I have db.properties file with information for connecting. This is a Maven project and I have added dependency for mysql-connector-java. I have also created a file Main.java in which I try to insert data into table to test if a connection is working. When I try to start the app I get following errors
- <b>Error stack trace</b>
- <pre><code>
- Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'adminDAOImpl': Unsatisfied dependency expressed through field 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getSessionFactory' defined in hr.fer.opp.infiniteloop.config.AppConfig: Invocation of init method failed; nested exception is org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution
- at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:587)
- at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
- at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:373)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1344)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
- at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
- at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
- at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
- at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
- at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
- at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
- at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
- at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:88)
- at hr.fer.opp.infiniteloop.testing.Main.main(Main.java:14)
- Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getSessionFactory' defined in hr.fer.opp.infiniteloop.config.AppConfig: Invocation of init method failed; nested exception is org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1710)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
- at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
- at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
- at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
- at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
- at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)
- at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
- at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
- at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584)
- ... 14 more
- Caused by: org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution
- at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
- at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
- at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
- at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:69)
- at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:60)
- at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcDatabaseMetaData(ImprovedExtractionContextImpl.java:67)
- at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.getTables(InformationExtractorJdbcDatabaseMetaDataImpl.java:329)
- at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.getTablesInformation(DatabaseInformationImpl.java:120)
- at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:65)
- at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:207)
- at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114)
- at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:183)
- at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
- at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:309)
- at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462)
- at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
- at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
- at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:535)
- at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:519)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1769)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1706)
- ... 24 more
- Caused by: java.sql.SQLException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL '"jdbc:mysql://infiniteloop.mysql.database.azure.com:3306/zalagaonica?useSSL=true&requireSSL=false";'
- at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2167)
- at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2037)
- at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543)
- at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
- at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180)
- at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43)
- ... 41 more
- Caused by: java.sql.SQLException: No suitable driver
- at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2158)
- ... 46 more
- </code></pre>
- <b>AppConfig</b>
- <pre><code>
- @Configuration
- @EnableWebMvc
- @EnableTransactionManagement
- @ComponentScan(basePackages="hr.fer.opp.infiniteloop")
- @PropertySource("classpath:db.properties")
- public class AppConfig {
- // set up variable to hold the properties
- @Autowired
- private Environment env;
- // set up a logger for diagnostics
- private Logger logger = Logger.getLogger(getClass().getName());
- // define a bean for ViewResolver
- @Bean
- public ViewResolver viewResolver() {
- InternalResourceViewResolver viewResolver = new
- InternalResourceViewResolver();
- viewResolver.setPrefix("/WEB-INF/view/");
- viewResolver.setSuffix(".jsp");
- return viewResolver;
- }
- // beans for hibernate
- @Bean
- public DataSource getDataSource() {
- BasicDataSource dataSource = new BasicDataSource();
- dataSource.setDriverClassName(env.getProperty("db.driver"));
- dataSource.setUrl(env.getProperty("db.url"));
- dataSource.setUsername(env.getProperty("db.user"));
- dataSource.setPassword(env.getProperty("db.password"));
- return dataSource;
- }
- @Bean
- public LocalSessionFactoryBean getSessionFactory() {
- LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
- factoryBean.setDataSource(getDataSource());
- factoryBean.setPackagesToScan("hr.fer.opp.infiniteloop.entity");
- Properties props = new Properties();
- props.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
- props.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
- props.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
- factoryBean.setHibernateProperties(props);
- return factoryBean;
- }
- @Bean
- public HibernateTransactionManager getTransactionManager() {
- HibernateTransactionManager transactionManager = new HibernateTransactionManager();
- transactionManager.setSessionFactory(getSessionFactory().getObject());
- return transactionManager;
- }
- </code></pre>
- <b>db.properties</b>
- <pre><code>
- #
- # JDBC connection properties
- #
- db.driver=com.mysql.jdbc.Driver
- db.url="jdbc:mysql://infiniteloop.mysql.database.azure.com:3306
- /zalagaonica?useSSL=true&requireSSL=false";
- db.user=username
- db.password=password
- #
- # Hibernate properties
- #
- hibernate.show_sql=true
- hibernate.hbm2ddl.auto=update
- hibernate.dialect=org.hibernate.dialect.MySQLDialect
- </code></pre>
- <b>Main.java</b> main method
- <pre><code>
- public static void main(String[] args) {
- AnnotationConfigApplicationContext context = new
- AnnotationConfigApplicationContext(AppConfig.class);
- AdminService adminService =
- context.getBean(AdminService.class);
- // Add Admins
- adminService.add(new Admin("Admin1"));
- adminService.add(new Admin("Admin2"));
- // Get Admins
- List<Admin> admins = adminService.getAdmins();
- for(Admin admin : admins)
- System.out.println(admin.getUsername());
- context.close();
- }
- </code></pre>
- Also I used this code in the same project to verify that I can connect to the database using this JDBC driver and code worked.
- <pre><code>
- public static void main (String[] args) throws Exception
- {
- // Initialize connection variables.
- String host = "infiniteloop.mysql.database.azure.com";
- String database = "zalagaonica";
- String user = "username";
- String password = "password";
- // check that the driver is installed
- try
- {
- Class.forName("com.mysql.jdbc.Driver");
- }
- catch (ClassNotFoundException e)
- {
- throw new ClassNotFoundException("MySQL JDBC driver NOT detected in library path.", e);
- }
- System.out.println("MySQL JDBC driver detected in library path.");
- Connection connection = null;
- // Initialize connection object
- try
- {
- String url = String.format("jdbc:mysql://%s/%s", host, database);
- // Set connection properties.
- Properties properties = new Properties();
- properties.setProperty("user", user);
- properties.setProperty("password", password);
- properties.setProperty("useSSL", "true");
- properties.setProperty("verifyServerCertificate", "true");
- properties.setProperty("requireSSL", "false");
- // get connection
- connection = DriverManager.getConnection(url, properties);
- }
- catch (SQLException e)
- {
- throw new SQLException("Failed to create connection to database.", e);
- }
- if (connection != null)
- {
- System.out.println("Successfully created connection to database.");
- // Perform some SQL queries over the connection.
- try
- {
- // Drop previous table of same name if one exists.
- Statement statement = connection.createStatement();
- statement.execute("DROP TABLE IF EXISTS inventory;");
- System.out.println("Finished dropping table (if existed).");
- // Create table.
- statement.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);");
- System.out.println("Created table.");
- // Insert some data into table.
- int nRowsInserted = 0;
- PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO inventory (name, quantity) VALUES (?, ?);");
- preparedStatement.setString(1, "banana");
- preparedStatement.setInt(2, 150);
- nRowsInserted += preparedStatement.executeUpdate();
- preparedStatement.setString(1, "orange");
- preparedStatement.setInt(2, 154);
- nRowsInserted += preparedStatement.executeUpdate();
- preparedStatement.setString(1, "apple");
- preparedStatement.setInt(2, 100);
- nRowsInserted += preparedStatement.executeUpdate();
- System.out.println(String.format("Inserted %d row(s) of data.", nRowsInserted));
- // NOTE No need to commit all changes to database, as auto-commit is enabled by default.
- }
- catch (SQLException e)
- {
- throw new SQLException("Encountered an error when executing given sql statement.", e);
- }
- }
- else {
- System.out.println("Failed to create connection to database.");
- }
- System.out.println("Execution finished.");
- </code></pre>
- I have looked every stack overflow post about this topic and non did provide me with the answer.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement