Quais são os possíveis valores da configuração do Hibernate hbm2ddl.auto e o que eles fazem

1085

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?

Vlad Mihalcea
fonte

Respostas:

1083

Na documentação da comunidade :

hibernate.hbm2ddl.auto Valida ou exporta automaticamente o esquema DDL para o banco de dados quando o SessionFactory é criado. Com create-drop, o esquema do banco de dados será descartado quando o SessionFactory for fechado explicitamente.

por exemplo, validar | atualização | criar | criar-soltar

Portanto, a lista de opções possíveis é,

  • validar : valida o esquema, não faz alterações no banco de dados.
  • update : atualiza o esquema.
  • create : cria o esquema, destruindo dados anteriores.
  • create-drop : descarte o esquema quando o SessionFactory for fechado explicitamente, normalmente quando o aplicativo for parado.
  • none : não faz nada com o esquema, não faz alterações no banco de dados

Essas opções parecem ser ferramentas de desenvolvedores e não para facilitar nenhum banco de dados em nível de produção. Você pode dar uma olhada na seguinte pergunta; Hibernate: hbm2ddl.auto = atualização em produção?

James McMahon
fonte
14
Basta ler o documento de hibernação ... para obter valores válidos, ele diz: "por exemplo" ... existem outros valores válidos?
Ta Sas
16
Eu acho que diz "por exemplo", porque é apenas uma documentação da comunidade, se alguém estiver interessado em todos os valores possíveis, ele pode ser encontrado no javadoc do Hibernate. (E sim, apenas as quatro opções estão presentes) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/...
Szegedi
4
validate diz validar o esquema, o que exatamente isso significa?
Hussain Akhtar Wahid 'Ghouri'
6
Você também pode usar 'aardvark', 'pombo' ou qualquer outra palavra, se quiser que o hibernate não faça nada. Não que eu recomendaria isso, é claro!
Ward
2
Uma pequena adição à opção criar e soltar. Se essa opção for usada, ele não descarta o esquema inteiro; em vez disso, descarta as tabelas cujos mapeamentos estão disponíveis durante a execução. Por exemplo, se uma base de dados com o Esquema S tem A, B, C e tabelas de código Java tem mapeamentos para A e B, só então irá hibernação não deixar cair a tabela C.
Aditya
194

Há também o valor não documentado de "none" para desativá-lo completamente.

Michiel Verkaik
fonte
7
Isso é realmente bastante útil, pois a validação de esquema do Hibernate às vezes falha em esquemas perfeitamente válidos.
Michael Piefel
Eu estava prestes a pedir algo assim. Minha intenção é reduzir o tempo de inicialização.
digao_mb
46
'string vazia' é melhor que 'none' . Para usar 'none', você receberá uma mensagem de aviso: org.hibernate.cfg.SettingsFactory - Valor não reconhecido para "hibernate.hbm2ddl.auto": none
okwap 06/06/2014
14
Eu consertei isso. Adicionado "none" como uma constante explicitamente válida.
Sanne
9
I like "hibernate.hbm2ddl.auto = batata" sobre os outros stackoverflow.com/a/15810379/838444
Sneg
161

A propriedade de configuração é chamada hibernate.hbm2ddl.auto

Em nosso ambiente de desenvolvimento, definimos hibernate.hbm2ddl.auto=create-dropcomo 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=updatepara 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.

Peter Hilton
fonte
5
Na verdade, de acordo com a documentação, create-drop cria as tabelas do banco de dados e as descarta quando a fábrica de sessões é explicitamente fechada. Ele não eliminar as tabelas quando a fábrica de sessão é criado.
Frans
4
Não, create-drop e create eliminam as tabelas quando a sessionfactory é criada, então create-drop também remove as tabelas quando o sessionfactory é fechado. Veja stackoverflow.com/a/6752698/1536382
Testo Testini
making hibernate.hbm2ddl.auto = criar queda na produção pode levar a vários tempos limite de conexão na produção?
METTAIBI
51

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.

Pat
fonte
6
Consulte stackoverflow.com/questions/221379/… para saber por que você não deve usar o hbm2ddl para produção.
Nathan Voxland
51

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:

  • create : - cria o esquema, os dados anteriormente presentes (se houver) no esquema são perdidos
  • update: - atualiza o esquema com os valores fornecidos.
  • validar: - valida o esquema. Não faz nenhuma alteração no banco de dados.
  • create-drop: - cria o esquema destruindo os dados anteriormente presentes (se houver). Ele também descarta o esquema do banco de dados quando o SessionFactory é fechado.

A seguir, são apresentados os pontos importantes:

  • Em caso de atualização , se o esquema não estiver presente no banco de dados, o esquema será criado.
  • Em caso de validação , se o esquema não existir no DB, ele não será criado. Em vez disso, lançará um erro: -Table not found:<table name>
  • No caso de criar e soltar , o esquema não é descartado ao fechar a sessão. Apenas cai ao fechar o SessionFactory.
  • 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.

amit
fonte
É realmente um ponto muito importante que o esquema será criado se não existir, quando a "atualização" for usada.
21918 yuranos
create-drop é contradito ao comparar as instruções "Explicação do comportamento" e "Pontos importantes".
VNT
2
Qual a diferença entre atualização e vazio ?
yashjain12yj
46

Primeiro, os possíveis valores para a hbm2ddlpropriedade 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 o SessionFactory, 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 :

  1. O hibernate.hbm2ddl.auto="update"é conveniente, mas menos flexível se você planeja adicionar funções ou executar alguns scripts personalizados.
  2. A abordagem mais flexível é usar o Flyway .

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.

Vlad Mihalcea
fonte
27

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

    <entry key="hibernate.hbm2ddl.auto" value="create">
  • update - atualizando o esquema existente

    <entry key="hibernate.hbm2ddl.auto" value="update">
  • validar - validar esquema existente

    <entry key="hibernate.hbm2ddl.auto" value="validate">
  • create-drop - cria e descarta o esquema automaticamente quando uma sessão é iniciada e finalizada

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
Vinod Kumawat
fonte
2
que tal <entry key = "hibernate.hbm2ddl.auto" value = "none">?
VNT
17

Se você não deseja usar Strings no seu aplicativo e procura constantes predefinidas, consulte a org.hibernate.cfg.AvailableSettingsclasse incluída no JAR do Hibernate, onde encontrará uma constante para todas as configurações possíveis. No seu caso, por exemplo:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
 * <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
Stefan Haberl
fonte
5
Por que a referência a mais de 700 linhas de arquivo fonte acima da resposta direta com quase 500 ratazanas?
Pavel Niedoba
... essa pergunta não faz nenhum sentido. Por que existem coisas? Por que eu estou aqui?
specializt
8
  • 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.
vishal thakur
fonte
Qual é a referência da documentação 'oficial'? - apenas me perguntando ...
Dirk Schumacher
7

Eu acho que você deveria ter que se concentrar no

SchemaExport Class 

esta classe torna sua configuração dinâmica Por isso, você pode escolher as suítes que melhor lhe convier ...

Caixa [SchemaExport]

Vishal Sharma
fonte
4

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.

Arun Raaj
fonte
3

Desde o 5.0 , agora você pode encontrar esses valores em um dedicado Enum: org.hibernate.boot.SchemaAutoTooling(aprimorado com o valor NONEdesde 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 DataSourceprogramaticamente com isso. Seria melhor usar isso combinado com, org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTOmas o código atual espera um Stringvalor (trecho extraído de SessionFactoryBuilderImpl):

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

… E enumvalores internos de ambos org.hibernate.boot.SchemaAutoToolinge org.hibernate.tool.schema.Actionnão são expostos publicamente.

A seguir, uma DataSourceconfiguraçã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ão create-droppor exemplo):

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {

    Map<String, Object> properties = new HashMap<>();
    properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
    properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());

    return builder
            .dataSource(internalDataSource)
            .packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
            .persistenceUnit(PERSISTENCE_UNIT_NAME)
            .properties(properties)
            .build();
}
Doc Davluz
fonte
0

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:

    /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;
ibrahim demir
fonte