[RESOLVIDO] Adicionar coluna numa tabela existente pelo Hibernate
6 respostas
daniellfeijo
Boa noite,
Tem como inserir uma coluna numa tabela já existente pelo Hibernate usando a Class GeraTabelas. Sem perder os dados dessa tabela? Estou tentando mas não consigo. Estou inserindo na classe modelo e rodando o GeraTabelas mas ele não adiciona.
publicclassGeraTabelas{publicstaticvoidmain(String[]args){AnnotationConfigurationcfg=newAnnotationConfiguration();cfg.addAnnotatedClass(Cliente.class);cfg.addAnnotatedClass(Usuario.class);cfg.addAnnotatedClass(Valvula.class);//se tiver com false no segundo argumento//ele não cria e somente exibe os codigos no consolenewSchemaExport(cfg).create(true,true);}}
Se você mapear a coluna na classe, e na configuração do seu hibernate colocar a propriedade hibernate.hbm2ddl.auto como update, ele edita sua tabela no banco.
daniellfeijo
ErickRAR,
Bom dia. Obrigado pela atenção. Na verdade já estava. Depois eu lembrei que nos atributos que eu inseri "ativo"na classe, acabei esquecendo os getters/setters dele. Será que foi isso? O Hibernate se baseia nos getters/setters para alterar o banco? Vou testar. Olha como estava meu hibernate.properties e minha classe modelo:
importjava.io.Serializable;importjavax.persistence.*;@EntitypublicclassUsuarioimplementsSerializable{//dados cadastrais@Id@GeneratedValueprivateLongid;@Column(name="ativo",updatable=true,nullable=true)privatedoubleativo;@Column(name="nome",length=10,updatable=true,nullable=true)privateStringnome;@Column(name="sobrenome",length=40,updatable=true,nullable=true)privateStringsobrenome;@Column(name="email",length=40,updatable=true,nullable=true)privateStringemail;@Column(name="login",length=20,updatable=true,nullable=true)privateStringlogin;@Column(name="senha",length=20,updatable=true,nullable=true)privateStringsenha;@Column(name="perfil",length=20,updatable=true,nullable=true)privateStringperfil;//Getters and SetterspublicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetPerfil(){returnperfil;}publicvoidsetPerfil(Stringperfil){this.perfil=perfil;}publicStringgetLogin(){returnlogin;}publicvoidsetLogin(Stringlogin){this.login=login;}publicStringgetSenha(){returnsenha;}publicvoidsetSenha(Stringsenha){this.senha=senha;}publicStringgetSobrenome(){returnsobrenome;}publicvoidsetSobrenome(Stringsobrenome){this.sobrenome=sobrenome;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(Stringemail){this.email=email;}}
O correto é ele apenas criar a coluna, não apagar nada. Isso pelo menos é o comportamento quando uso hibernate com PostGreSQL. Se no seu caso está apagando, eu recomendo fazer um backup do banco, criar de novo e ai restaurar.
Tem um backup que é do modo “INSERT”, ele gera os inserts nas tabelas e tal, não sei explicar isso direito, só mostro o caminho de tijolos amarelos.
Ah, o hibernate precisa que tenha get/set para os atributos mapeados. Você pode deixar os métodos como private se quiser, o importante é que tenha.
daniellfeijo
ErickRAR,
Valeu pela atenção. Vou continuar investigando porque ele está apagando. Se conseguir qualquer coisa eu posto aqui.
Abraço…
daniellfeijo
Pronto! Resolvido.
Na verdade não tem necessidade dessa classe GeraTabelas!
O problema é que com SchemaExport(cfg).create(true, true) na classe GeraTabelas, sempre irá dropar a tabela.
Mas isso tudo não precisa usar. Usando a propriedade hibernate.hbm2ddl.auto com valor update, as tabelas são criadas em tempo de execução. Não precisa se preocupar em ficar gerando tabela ou atualizando por fora. Basta alterar a classe modelo, criar seus Getters and Setters e rodar a aplicação que automaticamente seu banco vai ser atualizado!
A confusão toda foi por causa dessa maldita classe GeraTabelas!