Eu estava trabalhando em meu projeto de aplicativo de boot Spring e percebi que, às vezes, há um erro de tempo limite de conexão com meu banco de dados em outro servidor (SQL Server). Isso acontece especialmente quando tento fazer alguma migração de script, FlyWay
mas funciona depois de várias tentativas.
Então percebi que não especifiquei spring.jpa.hibernate.ddl-auto
no meu arquivo de propriedades. Eu fiz algumas pesquisas e descobri que é recomendado adicionar
spring.jpa.hibernate.ddl-auto= create-drop
desenvolvimento. E mude para: spring.jpa.hibernate.ddl-auto= none
em produção.
Mas eu realmente não entendi como isso realmente funciona e como o hibernate gera o esquema do banco de dados usando create-drop
ou none
valor. Você pode explicar tecnicamente como isso realmente funciona e quais são as recomendações para o uso desta propriedade em desenvolvimento e em um servidor de produção. Obrigado
none
mas você pode querer que suas tabelas Hibernate Search e Envers sejam geradas usando,update
uma vez que são gerenciadas internamente por esses projetos e você não deseja gerenciá-las manualmente. No momento, controlamos isso globalmente para todas as tabelas, independentemente de sua origem / fonte. Isso seria mais uma razão para usar opções específicas do fornecedor se você quiser usar isso.Respostas:
Para o registro, a
spring.jpa.hibernate.ddl-auto
propriedade é específica do Spring Data JPA e é sua maneira de especificar um valor que será eventualmente passado para o Hibernate sob a propriedade que ele conhecehibernate.hbm2ddl.auto
,.Os valores
create
,create-drop
,validate
, eupdate
, basicamente, influenciar a forma como o gerenciamento de ferramentas esquema irá manipular o esquema de banco de dados na inicialização.Por exemplo, a
update
operação consultará a API do driver JDBC para obter os metadados do banco de dados e então o Hibernate compara o modelo de objeto que ele cria com base na leitura de suas classes anotadas ou mapeamentos HBM XML e tentará ajustar o esquema em tempo real.A
update
operação, por exemplo, tentará adicionar novas colunas, restrições, etc., mas nunca removerá uma coluna ou restrição que possa ter existido anteriormente, mas não faz mais parte do modelo de objeto de uma execução anterior.Normalmente, em cenários de caso de teste, você provavelmente usará
create-drop
para criar seu esquema, seu caso de teste adiciona alguns dados de simulação, você executa seus testes e, durante a limpeza do caso de teste, os objetos de esquema são descartados, deixando um banco de dados vazio.Em desenvolvimento, geralmente é comum ver os desenvolvedores usarem
update
para modificar automaticamente o esquema para adicionar novas adições na reinicialização. Mas, novamente, entenda, isso não remove uma coluna ou restrição que possa existir em execuções anteriores que não seja mais necessária.Na produção, geralmente é altamente recomendável usar
none
ou simplesmente não especificar essa propriedade. Isso ocorre porque é uma prática comum para DBAs revisar os scripts de migração para alterações no banco de dados, especialmente se seu banco de dados for compartilhado entre vários serviços e aplicativos.fonte
validate
no ambiente de produção?validate
na produção, mas normalmente essa deve ser uma configuração usada em seu ambiente de qualidade / teste para verificar se os scripts de banco de dados que você escreveu ou aplicou à ferramenta de migração de banco de dados são precisos. Outro motivo para não usarvalidate
na produção é que pode ser um gargalo durante o processo de inicialização do seu aplicativo, especialmente se o seu modelo de objeto for muito extenso em tamanho ou se outros fatores relacionados à rede entrarem em ação.order
está sendo interpretado incorretamente pelo analisador SQL, uma vez que é uma palavra-chave se não está sendo escapado.