5

Exemplo: eu tenho a classe Pessoa abaixo:

@Entity
public class Pessoa {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idPessoa;
    private String nome;

    //getters e setters

}

O hibernate, por padrão, persiste no banco uma String como Varchar, e quero persistir no banco como text e altero para a seguinte configuração:

@Entity
public class Pessoa {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idPessoa;

    @Column(columnDefinition = "text")
    private String nome;

    //getters e setters

}

Acrescentando a annotation "@Column(columnDefinition = "text")" no atributo String, e para isso persistir como text, estou dropando a tabela já criada no banco, e minha dúvida é a seguinte:

Teria uma forma de eu não precisar ficar dropando a tabela no banco de dados, visto que em um sistema mais complexo, isso pode me causar problemas de consistência?

10
  • Já trabalhei em um projeto que quando tinha essas mudanças a gente alterava na classe e dava um alter na coluna do banco. Não sei se é a melhor maneira, mas funcionava. Isso porque tinha vezes que o Hibernate não atualizava todas tabelas rodando com update ou deixava de criar alguma sequence. Commented 8/08/2015 às 14:13
  • @MaiconCarraro eu queria eliminar esse alter também, queria é ficar despreocupado com o banco, pra que eu entre o minimo possível no banco. Mesmo porque tem cliente que não gosta muito quando pedimos acesso ao banco Commented 8/08/2015 às 14:38
  • stackoverflow.com/questions/12400825/… Commented 8/08/2015 às 14:41
  • 1
    Esse tipo de alteração é sempre chato de gerenciar mesmo. Particularmente uso o flywaydb para gerenciar toda DDL para mim, não uso JPA provider para isto, nele consigo gerenciar tudo, fazer roolback de alterações, etc. Commented 8/08/2015 às 15:25
  • 1
    O recurso do hibernate de criar ou alterar o banco conforme as anotações nas entidades só é adequado para usar em bases de produção se o sistema for mesmo muito simples e se a integridade dos dados nem for lá tão importante. A maioria dos sistemas não é assim. Provavelmente você terá que desenvolver ou escolher um processo e uma ferramenta à parte para fazer a migração do banco de dados em vez de contar com o Hibernate para isso.
    – Caffé
    Commented 10/08/2015 às 18:01

1 Resposta 1

2

Correto, Pois quando você deixa que o hibernate gere as tabelas para você baseado em seus modelos, ele apenas cria coisas, e não deleta.

A não ser que você faça a seguinte configuração:

<property name="hibernate.hbm2ddl.auto" value="create-drop" />
  • Porem ele vai deletar todo o banco e criar novamente cada vez que você iniciar seu servidor de aplicação.

A melhor forma é fazer este processo na mão mesmo, pois não é aconselhável em projetos rodando em produção deixar o hibernate fazer a manutenção em seu banco de dados.

O ideal é você uma estrutura em que ele verifique o que a de diferente no banco de dados e apenas mostre para você os scripts que você deve aplicar, como criação de tabelas e adição de campos. E o resto como alteração de nome de tabelas ou até exclusão de um campo ou tabela você faça o script na mão mesmo.

Você deve fazer log-in para responder a esta pergunta.

Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag .