Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Projeto [ projeto-jpa-2 ] com banco HSQLDB, no lugar do MySQL

Pela capacidade do meu micro troquei o banco Mysql pelo HSQLDB 2.4.0, atualizei o pom.xml trocando o banco:

<dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.4.0</version>
        </dependency>

também atualizei a classe, JpaConfigurator

@Bean
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
        dataSource.setUrl("jdbc:hsqldb:hsql://localhost/projeto_jpa");
        dataSource.setUsername("SA");
        dataSource.setPassword("");

        return dataSource;
    }

    @Bean //propriedades do persistense.xml 
    public LocalContainerEntityManagerFactoryBean getEntityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

        entityManagerFactory.setPackagesToScan("br.com.caelum");
        entityManagerFactory.setDataSource(dataSource);

        entityManagerFactory
                .setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        Properties props = new Properties();

        props.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
        props.setProperty("hibernate.show_sql", "true");
        props.setProperty("hibernate.cache.use_second_level_cache", "true");
        props.setProperty("hibernate.hbm2ddl.auto", "update"); //create-drop
        props.setProperty("hibernate.generate_statistics", "true");

        entityManagerFactory.setJpaProperties(props);
        return entityManagerFactory;
    }

Porém ocorre erro ao inicar o projeto, no Tomcat v8.5:

INFORMAÇÕES: Initializing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into Loja (id, nome) values (default, ?)
Hibernate: insert into Loja (id, nome) values (default, ?)
Hibernate: insert into Categoria (id, nome) values (default, ?)
Hibernate: insert into Categoria (id, nome) values (default, ?)
Hibernate: insert into Produto (id, descricao, linkDaFoto, loja_id, nome, preco) values (default, ?, ?, ?, ?, ?)
abr 18, 2018 2:34:00 PM org.apache.catalina.core.StandardContext listenerStart
GRAVE: Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'criadorDeProdutos': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
...
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
...
    ... 23 more
Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
...
    ... 40 more
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: PRODUTO in statement [insert into Produto (id, descricao, linkDaFoto, loja_id, nome, preco) values (default, ?, ?, ?, ?, ?)]
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
...
abr 18, 2018 2:34:00 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: One or more listeners failed to start. Full details will be found in the appropriate container log file
abr 18, 2018 2:34:00 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: Context [/projeto-jpa-2] startup failed due to previous errors
abr 18, 2018 2:34:00 PM org.apache.catalina.core.ApplicationContext log
INFORMAÇÕES: Closing Spring root WebApplicationContext
abr 18, 2018 2:34:00 PM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesJdbc
ADVERTÊNCIA: The web application [projeto-jpa-2] registered the JDBC driver [org.hsqldb.jdbc.JDBCDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

Podem ajudar com a configuração?

5 respostas

verifiquei o log e parece que o problema esta na classe CriadorDeProdutos, tem caracteres nao reconhecidos ao importar no projeto, fiz ajustes mas não deu certo - tirando acentos e cedilhas.

também troquei no Build Path a JRE para a padrao 1.8. agora as tabelas sao geradas vazias, mas o projeto não é iniciado..

HTTP Status 404 – Not Found

Type Status Report

Message /projeto-jpa-2/

Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
Apache Tomcat/8.5.29

mais erros no log:, parcial:

GRAVE: Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'criadorDeProdutos': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement

...
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement
...
caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement
...
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: PRODUTO in statement [insert into Produto (id, descricao, linkDaFoto, loja_id, nome, preco) values (default, ?, ?, ?, ?, ?)]

Que horas que esses inserts estão sendo executados? E acho que essa classe aqui está errada => "org.hsqldb.jdbcDriver"

Não seria "org.hsqldb.jdbc.Driver"?

Olá Alberto, acho que não é isso! fiz um teste e agora da erro no novo parametro: Could not load JDBC driver class [org.hsqldb.jdbc.Driver], deve ser outra coisa, mas ainda não consegui achar. Se quiser acesso remoto ou algo possa ajudar, obrigado pelo retorno.

O problema ocorre já ao iniciar o serviço do Tomcat com a aplicação, não consigo nem usar o site, conforme logs acima. posso te enviar o projeto compactado?

GRAVE: Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'getEntityManagerFactory' defined in class path resource [br/com/caelum/JpaConfigurator.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.sql.DataSource]: : Error creating bean with name 'getDataSource' defined in class path resource [br/com/caelum/JpaConfigurator.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'getDataSource' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [org.hsqldb.jdbc.Driver]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getDataSource' defined in class path resource [br/com/caelum/JpaConfigurator.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'getDataSource' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [org.hsqldb.jdbc.Driver]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)

Conferi aqui e realmente o nome da classe é org.hsqldb.jdbcDriver. Achei essa outra discussão aqui na alura ->https://cursos.alura.com.br/forum/topico-user-lacks-privilege-or-object-not-found-38704

É citado que o problema pode ter a ver com o usuário que você está rodando a aplicação.

solução!

Muito obrigado Alberto,

essa dica me ajudou a encontrar a solução, na verdade não tem a resposta neste post - mas me deu uma ideia pra pesquisa.

Na verdade o erro de permissao ou objeto inexistente ocorria porque o Hibernate tentou criar a tabela PRODUTO com um campo do tipo TEXT (LONGVARCHAR) nao permitido no hsqldb por padrao.

para resolver isso, basta ativar o recurso de compatibilidade com o MySQL, e pronto.

comando:

SET DATABASE SQL SYNTAX MYS { TRUE | FALSE }

Support for MySQL style syntax

This property, when set true, enables support for TEXT and AUTO_INCREMENT types and also allow compatibility with some other aspects of this dialect.

ok