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

Duvida aula 1 JPA

Oi, já tinha feito um tópico sobre esta mesma duvida anteriormentee me disseram q se eu utilizasse o mysql na verção 5.7 iria funcionar, dai reinstalei tudo, mas os mesmos erros continuam

segue discussão anterior: https://cursos.alura.com.br/forum/topico-duvida-erros-na-aula-1-67249

29 respostas

Oi Lucas, jogue fora todos os arquivos externos que você colocou no projeto (os .jars) e dê um clean ( no menu superior do eclipse vá em Project -> Clean) para limpar o projeto.

E coloque novamente as bibliotecas com as versões corretas. Como você fez muitas modificações das dependências do projeto, pode ser que alguma lib esteja duplicada e causando algum conflito no classpath.

Espero ter ajudado e bons estudos!

eu desfiz as modificações eu baixei novamente o arquivo disponibilizado na aula sem nenhuma mudança e apaguei o q eu mexi

Lucas,

Eu tive o mesmo problema, estava usando o MySQL 8.0.12, e o driver (Connector/J) fornecido no curso, que era da versão 5, e dava este erro.

Mantive o MySQL na versão 8.0.12.

Resolvi fazendo download do Connector/J na versão 8.0.12. (mysql-connector-java-8.0.12.jar)

https://dev.mysql.com/downloads/connector/j/

Fazer o download e colocar o .jar na pasta lib do projeto. Não esquecer de adicionar ao Build Path.

Na instalação do MySQL 8, eu usei aquela opção para manter a compatibilidade com o 5.

Oi Afonso

Você trocou só o Connector/J ?

porque eu tentei fazer isso aqui e continuou dando erro.

quando eu baixo o hibernate mais atualizado no site do hibernate alguns erros somem, mas parece q esta faltando algum arquivo, pq resta um erro.

tentei atualizar a lib do hibernate e agora to recebendo uma exception no percistence aff

q coisa meu curso não anda to a quase uma semana tentando resolver isso, ja tentei atualizar a lib, já tentei usar o mysql 5.7 continua dando erro aff

Olá Lucas, boa noite! Copia e cola a stacktrace do erro aqui pra gente poder te ajudar.

Oi thais.

tem vários erros

Exception in thread "main" javax.persistence.PersistenceException: Unable to locate persistence units at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:85) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:61) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:50) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at br.com.caelum.financas.jpa.TesteJPA.main(TesteJPA.java:36) Caused by: javax.persistence.PersistenceException: Invalid persistence.xml. Error parsing XML [line : -1, column : -1] : cvc-elt.1: Não pode localizar a declaração do elemento 'persistence'.

at org.hibernate.jpa.boot.internal.PersistenceXmlParser.validate(PersistenceXmlParser.java:487)
at org.hibernate.jpa.boot.internal.PersistenceXmlParser.loadUrl(PersistenceXmlParser.java:439)
at org.hibernate.jpa.boot.internal.PersistenceXmlParser.parsePersistenceXml(PersistenceXmlParser.java:242)
at org.hibernate.jpa.boot.internal.PersistenceXmlParser.parsePersistenceXml(PersistenceXmlParser.java:235)
at org.hibernate.jpa.boot.internal.PersistenceXmlParser.doResolve(PersistenceXmlParser.java:229)
at org.hibernate.jpa.boot.internal.PersistenceXmlParser.locatePersistenceUnits(PersistenceXmlParser.java:67)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:81)
... 5 more

Olá Lucas,

A mensagem diz que ele não consegue encontrar a persistence unit. Você colocou o persistence.xml na pasta META-INF do projeto? Qual o nome que consta na persistence unit name? No meu consta:

Quanto a lib do hibernate, que eu me lembre, baixei aquela indicada no curso. Lembrando que as libs tem que estar no classpath.

Segue o conteúdo da minha pasta lib do projeto:

antlr-2.7.7.jar
byte-buddy-1.8.17.jar
classmate-1.3.4.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-5.0.4.Final.jar
hibernate-core-5.3.5.Final.jar
jandex-2.0.5.Final.jar
javassist-3.23.1-GA.jar
javax.activation-api-1.2.0.jar
javax.persistence-api-2.2.jar
jboss-logging-3.3.2.Final.jar
jboss-transaction-api_1.2_spec-1.1.1.Final.jar
mysql-connector-java-8.0.12.jar

Conteúdo do arquivo .classpath, na pasta principal do projeto Eclipse:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="lib" path="lib/antlr-2.7.7.jar"/>
    <classpathentry kind="lib" path="lib/byte-buddy-1.8.17.jar"/>
    <classpathentry kind="lib" path="lib/classmate-1.3.4.jar"/>
    <classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
    <classpathentry kind="lib" path="lib/hibernate-commons-annotations-5.0.4.Final.jar"/>
    <classpathentry kind="lib" path="lib/hibernate-core-5.3.5.Final.jar"/>
    <classpathentry kind="lib" path="lib/jandex-2.0.5.Final.jar"/>
    <classpathentry kind="lib" path="lib/javassist-3.23.1-GA.jar"/>
    <classpathentry kind="lib" path="lib/javax.activation-api-1.2.0.jar"/>
    <classpathentry kind="lib" path="lib/javax.persistence-api-2.2.jar"/>
    <classpathentry kind="lib" path="lib/jboss-logging-3.3.2.Final.jar"/>
    <classpathentry kind="lib" path="lib/jboss-transaction-api_1.2_spec-1.1.1.Final.jar"/>
    <classpathentry kind="lib" path="lib/mysql-connector-java-8.0.12.jar"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

Se estiver tudo certo no seu persistence.xml, então provavelmente o problema é com as bibliotecas mesmo. Confira as libs.

Oi Afonso, meu .classpath e minha lib esta exatamente igual a sua.

sera q o erro é nó persistence.xml ? segue meu persistence.xml:


<persistence-unit name="contas-mysql">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>br.com.caelum.financas.modelo.Conta</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/contas" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="123456" />

        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
    </properties>
</persistence-unit>

<persistence-unit name="contas-hsqldb">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>br.com.caelum.financas.modelo.Conta</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:contas" />
        <property name="javax.persistence.jdbc.user" value="sa" />
        <property name="javax.persistence.jdbc.password" value="" />

        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
    </properties>
</persistence-unit>

<persistence-unit name="contas-postgres">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>br.com.caelum.financas.modelo.Conta</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/contas" />
        <property name="javax.persistence.jdbc.user" value="rafaelpbaptista" />
        <property name="javax.persistence.jdbc.password" value="" />

        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
    </properties>
</persistence-unit>

Faltou o cabeçalho ali em cima:(deixei sem o ">" no final porque se não o código não aparece aqui)

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_2.xsd" version="2.2"

O projeto é aquele de exemplo "contas-jpa" ? Se for ele, está correto.

Nesse projeto, conteúdo da lib:

antlr-2.7.7.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.9.Final.jar
hibernate-entitymanager-4.1.9.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
hsqldb.jar
javassist-3.17.1-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
mysql-connector-java-8.0.12.jar
postgresql-9.2-1002.jdbc4.jar

Se não achar nada incorreto, sugiro começar do zero, desinstalar tudo o que instalou, baixar novamente os projetos e as ferramentas e instalar do zero. Seguir atentamente todos os passos descritos na aula.

Oi Lucas, como o Afonso comentou, a mensagem diz que ele não consegue encontrar a unidade de persistência. O arquivo persistence.xml precisa estar na pasta src/META-INF para funcionar.

oi Afonso!

Essa lib eh a q vem com o projeto certo?

no meu estão as que vc citou anteriormente:

antlr-2.7.7.jar byte-buddy-1.8.17.jar classmate-1.3.4.jar dom4j-1.6.1.jar hibernate-commons-annotations-5.0.4.Final.jar hibernate-core-5.3.5.Final.jar jandex-2.0.5.Final.jar javassist-3.23.1-GA.jar javax.activation-api-1.2.0.jar javax.persistence-api-2.2.jar jboss-logging-3.3.2.Final.jar jboss-transaction-api_1.2_spec-1.1.1.Final.jar mysql-connector-java-8.0.12.jar

seria melhor eu deixar a q veio no projeto?

Sim, seria melhor deixar a lib que veio no projeto. Só trocar o mysql-connector pela versão compatível com sua versão de banco, caso esteja usando o MySQL 8 ( mysql-connector-java-8.0.12.jar).

Eu fiz como vc disse e só troquei o connector do mysql, porem ainda tem alguns erros, vou colar uma parte aqui, não da pra colar tudo por causa do limite de palavras e pq são muitos

ERROR: HHH000319: Could not get database metadata java.sql.SQLSyntaxErrorException: Unknown database 'contas'

ago 22, 2018 2:27:35 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute ERROR: HHH000299: Could not complete schema update java.sql.SQLSyntaxErrorException: Unknown database 'contas'

Wed Aug 22 14:27:35 BRT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. ago 22, 2018 2:27:35 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 1049, SQLState: 42000 ago 22, 2018 2:27:35 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: Unknown database 'contas' Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: Could not open connection

Caused by: java.sql.SQLSyntaxErrorException: Unknown database 'contas'

Você criou o database no MySQL?

Pode ter relação com minha DB, pode ser diferença de nome da minha DB ou algo assim

Pode ter haver com o banco msm, fui tentar dar run no contas-JDBC e esta dando esse erro tbm:

Exception in thread "main" java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client at br.com.caelum.financas.jdbc.ConnectionFactory.getConnectionMySQL(ConnectionFactory.java:15) at br.com.caelum.financas.jdbc.TesteJDBCMySQL.main(TesteJDBCMySQL.java:19) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.Util.getInstance(Util.java:381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:911) at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3953) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1276) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2048) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:723) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:46) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at br.com.caelum.financas.jdbc.ConnectionFactory.getConnectionMySQL(ConnectionFactory.java:12) ... 1 more

Qual versão do MySQL você está utilizando? O projeto contas-jdbc espera que você esteja utilizando o MySQL na versão 5.

eu estou utilizando a versão 8, porém eu troquei o connector

Lucas, modifique esta parte do método getConnectionMySQL() da sua classe ConnectionFactory

de:

Class.forName("com.mysql.jdbc.Driver");

para:

Class.forName("com.mysql.cj.jdbc.Driver");

e veja se funciona.

Nada Thais deu isso:


Wed Aug 22 20:00:26 BRT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: The server time zone value 'Hora oficial do Brasil' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support. at br.com.caelum.financas.jdbc.ConnectionFactory.getConnectionMySQL(ConnectionFactory.java:15) at br.com.caelum.financas.jdbc.TesteJDBCMySQL.main(TesteJDBCMySQL.java:19) Caused by: java.sql.SQLException: The server time zone value 'Hora oficial do Brasil' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:832) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:456) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at br.com.caelum.financas.jdbc.ConnectionFactory.getConnectionMySQL(ConnectionFactory.java:12) ... 1 more Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Hora oficial do Brasil' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85) at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:128) at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2236) at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2260) at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1314) at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:963) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:822) ... 7 more

O erro mudou, agora está dando problema no timezone do banco. Muda url de conexão. Mude o retorno do método getConnectionMySQL()

de:

return DriverManager.getConnection("jdbc:mysql://localhost/contas", "root", "");

para:

return DriverManager.getConnection("jdbc:mysql://localhost/contas?useTimezone=true&serverTimezone=UTC", "root", "");

E veja se dá certo.

Agora mudou o erro, deu isso:

Wed Aug 22 20:27:41 BRT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. Exception in thread "main" java.lang.RuntimeException: java.sql.SQLSyntaxErrorException: Table 'contas.conta' doesn't exist at br.com.caelum.financas.jdbc.ContaDAO.adiciona(ContaDAO.java:32) at br.com.caelum.financas.jdbc.TesteJDBCMySQL.main(TesteJDBCMySQL.java:24) Caused by: java.sql.SQLSyntaxErrorException: Table 'contas.conta' doesn't exist at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:975) at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:392) at br.com.caelum.financas.jdbc.ContaDAO.adiciona(ContaDAO.java:29) ... 1 more

O erro que deu agora foi:Table 'contas.conta' doesn't exist . Ou seja, a tabela contas.conta não existe. Crie a database contas no banco e a tabela conta em contas.

O do JDCBC funcionou.

mas o jpa ainda esta com erros, coloquei eles no google drive pq aqui não cabe https://docs.google.com/document/d/1AjKZNzRiTGkgJnYftxu202Egiu_FYA21O5wTkxCDIlM/edit?usp=sharing

eu tenho q mudar a connection no persistence tbm?

solução!

Lucas,

O erro que aparece no Stracktrace:

java.sql.SQLException: The server time zone value 'Hora oficial do Brasil' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

Já foi abordado em outro tópico aqui do fórum:

https://cursos.alura.com.br/forum/topico-erro-no-timezone-67740

Leia o tópico e tente aplicar a mesma solução.

Resumindo, se vocẽ estiver usando Windows, o MySQL pode apresentar este problema mesmo. Em minha instalação resolvi da seguinte forma:

  • Parar o servidor MySQL
  • Editar o arquivo my.ini ( C:\ProgramData\MySQL\MySQL Server 8.0\my.ini )
  • Inserir a linha:
    default-time-zone = +3:00
  • Reiniciar o servidor MySQL

Muito obrigado Thais e Afonso, agora esta funcionando, muito obrigado pela ajuda, agora posso continuar meus estudos, estou marcando o post anterior como solução, mas os outros comentários tbm fazem parte da solução kkkk.

Muito obrigado pela atenção mais uma vez.