4
respostas

Exception inesperado

Todos os codigos estavam compilando perfeitamente até essa aula. Desde entao, toda vez que compilo qualquer teste, aparece essas Exceptions em meu console e mesmo assim o código cumpre com que é pedido:

jul. 16, 2022 2:35:21 AM org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException
WARN: GenerationTarget encountered exception accepting command : Error executing DDL "
    alter table produtos 
       add constraint FK8rqw0ljwdaom34jr2t46bjtrn 
       foreign key (categoria_id) 
       references categorias (id)" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "

Queria entender o motivo dessa exception, pois mesmo dando Exception, o codigo cumpre com oq é pedido.

4 respostas

Oi Paulo,

Provavelmente é por conta do esquema do hibernate gerar as tabelas automaticamente.

Se você alterar a propriedade no persistence.xml de update para create o problema deve não ocorrer mais. Obs: essa propriedade na realidade deve ser usada apenas para testes, pois o ideal em uma aplicação é ter um controle melhor do banco de dados e geralmente se utiliza alguma biblioteca de Migration para isso, como o Flyway

Então... meu persistence.xml está em create e fica dando essa exception varias vezes. Meu arquivo persistence.xml esta dessa forma:

<?xml version="1.0" encoding="UTF-8"?>

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

    <persistence-unit name="nova-loja" transaction-type="RESOURCE_LOCAL">
        <properties>    
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/nova_loja?useTimezone=true;serverTimezone=UTC" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="Paulo5879" />

            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>

    </persistence-unit>

</persistence>

Oi Paulo,

Tem um problema com o Dialect do MySQL8 que causa essa exception ao usar o hbm2ddl.auto com os valores create ou create-drop.

Você pode utilizar esse outro dialeto para não ter a excpetion: <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />

Deu certo! Meu código parou de dar Exception. Muito Obrigado!