Eu realmente quero saber mais sobre a atualização, exportação e os valores que podem ser dados. hibernate.hbm2ddl.auto
Eu preciso saber quando usar a atualização e quando não? E qual é a alternativa?
Estas são as mudanças que podem acontecer no DB:
- novas tabelas
- novas colunas em tabelas antigas
- colunas excluídas
- tipo de dados de uma coluna alterado
- um tipo de coluna mudou seus atributos
- mesas derrubadas
- valores de uma coluna alterados
Em cada caso, qual é a melhor solução?
Há também o valor não documentado de "none" para desativá-lo completamente.
fonte
A propriedade de configuração é chamada
hibernate.hbm2ddl.auto
Em nosso ambiente de desenvolvimento, definimos
hibernate.hbm2ddl.auto=create-drop
como eliminar e criar um banco de dados limpo toda vez que implantamos, para que nosso banco de dados esteja em um estado conhecido.Em teoria, você pode configurar
hibernate.hbm2ddl.auto=update
para atualizar seu banco de dados com alterações em seu modelo, mas eu não confiaria nisso em um banco de dados de produção. Uma versão anterior da documentação dizia que isso era experimental, pelo menos; Eu não sei o status atual.Portanto, para nosso banco de dados de produção, não defina
hibernate.hbm2ddl.auto
- o padrão é não fazer alterações no banco de dados. Em vez disso, criamos manualmente um script de atualização DDL do SQL que aplica alterações de uma versão para a próxima.fonte
Eu usaria o liquibase para atualizar seu banco de dados. O recurso de atualização de esquema do hibernate é realmente bom apenas para um desenvolvedor enquanto ele está desenvolvendo novos recursos. Em uma situação de produção, a atualização do banco de dados precisa ser tratada com mais cuidado.
fonte
Embora seja um post bastante antigo, mas como fiz algumas pesquisas sobre o assunto, pensei em compartilhá-lo.
hibernate.hbm2ddl.auto
De acordo com a documentação, ele pode ter quatro valores válidos:
criar | atualização | validar | criar-soltar
A seguir, é apresentada a explicação do comportamento mostrado por esses valores:
A seguir, são apresentados os pontos importantes:
Table not found:<table name>
Caso eu dê algum valor a essa propriedade (digamos abc, em vez de acima dos quatro valores discutidos acima) ou ele será deixado em branco. Mostra o seguinte comportamento:
-Se o esquema não estiver presente no banco de dados: - Ele cria o esquema
-Se o esquema estiver presente no banco de dados: - atualize o esquema.
fonte
Primeiro, os possíveis valores para a
hbm2ddl
propriedade de configuração são os seguintes:none
- Nenhuma ação é executada. O esquema não será gerado.create-only
- O esquema do banco de dados será gerado.drop
- O esquema do banco de dados será descartado e criado posteriormente.create
- O esquema do banco de dados será descartado e criado posteriormente.create-drop
- O esquema do banco de dados será descartado e criado posteriormente. Ao fechar oSessionFactory
, o esquema do banco de dados será descartado.validate
- O esquema do banco de dados será validado usando os mapeamentos de entidade.update
- O esquema do banco de dados será atualizado comparando o esquema do banco de dados existente com os mapeamentos da entidade.Dediquei um post para as estratégias mais comuns de geração de DDL do Hibernate :
hibernate.hbm2ddl.auto="update"
é conveniente, mas menos flexível se você planeja adicionar funções ou executar alguns scripts personalizados.No entanto, mesmo se você usar o Flyway, ainda poderá gerar o script de migração inicial usando hbm2ddl. Em deste artigo , você pode ver como você pode combinar o Modelo de Entidade JPA com jOOQ Tabela Modelo.
fonte
hibernate.hbm2ddl.auto
valida e exporta automaticamente DDL para o esquema quando o sessionFactory é criado.Por padrão, ele não realiza nenhuma criação ou modificação automaticamente no DB. Se o usuário definir um dos valores abaixo, ele fará as alterações do esquema DDL automaticamente.
create - criando um esquema
update - atualizando o esquema existente
validar - validar esquema existente
create-drop - cria e descarta o esquema automaticamente quando uma sessão é iniciada e finalizada
fonte
Se você não deseja usar Strings no seu aplicativo e procura constantes predefinidas, consulte a
org.hibernate.cfg.AvailableSettings
classe incluída no JAR do Hibernate, onde encontrará uma constante para todas as configurações possíveis. No seu caso, por exemplo:fonte
validate
: valida o esquema, nenhuma alteração acontece no banco de dados.update
: atualiza o esquema com a consulta de execução atual.create
: cria novo esquema todas as vezes e destrói dados anteriores.create-drop
: elimina o esquema quando o aplicativo é parado ou o SessionFactory é fechado explicitamente.fonte
Eu acho que você deveria ter que se concentrar no
esta classe torna sua configuração dinâmica Por isso, você pode escolher as suítes que melhor lhe convier ...
Caixa [SchemaExport]
fonte
validate
: Valida o esquema e não faz alterações no banco de dados.Suponha que você incluiu uma nova coluna no arquivo de mapeamento e execute a operação de inserção; ela exibirá uma exceção "faltando a coluna XYZ" porque o esquema existente é diferente do objeto que você deseja inserir. Se você alterar a tabela adicionando essa nova coluna manualmente e, em seguida, execute a operação Inserir, ela definitivamente inserirá todas as colunas junto com a nova coluna na Tabela. Significa que ele não faz nenhuma alteração / altera o esquema / tabela existente.
update
: altera a tabela existente no banco de dados quando você executa a operação. Você pode adicionar ou remover colunas com esta opção de hbm2ddl. Mas se você quiser adicionar uma nova coluna que seja 'NOT NULL', ela ignorará a adição dessa coluna específica ao banco de dados. Porque a tabela deve estar vazia se você deseja adicionar uma coluna 'NOT NULL' à tabela existente.fonte
Desde o 5.0 , agora você pode encontrar esses valores em um dedicado
Enum
:org.hibernate.boot.SchemaAutoTooling
(aprimorado com o valorNONE
desde 5.2).Ou melhor ainda, desde a versão 5.1 , você também pode usar a que combina ações JPA 2 e Hibernate DDL "herdadas".
org.hibernate.tool.schema.Action
Enum
Mas você ainda não pode configurar um
DataSource
programaticamente com isso. Seria melhor usar isso combinado com,org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO
mas o código atual espera umString
valor (trecho extraído deSessionFactoryBuilderImpl
):… E
enum
valores internos de ambosorg.hibernate.boot.SchemaAutoTooling
eorg.hibernate.tool.schema.Action
não são expostos publicamente.A seguir, uma
DataSource
configuração programática de exemplo (usada em um dos meus aplicativos Spring Boot) que usa uma aposta graças a,.name().toLowerCase()
mas só funciona com valores sem traço (nãocreate-drop
por exemplo):fonte
Para quem procura o valor padrão ...
Está escrito no código-fonte na versão 2.0.5 do spring-boot e 1.1.0 no JpaProperties:
fonte