[RESOLVIDO] Adicionar coluna numa tabela existente pelo Hibernate

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.

public class GeraTabelas {
		public static void main(String[] args) {
			
			AnnotationConfiguration cfg = new AnnotationConfiguration();
			
			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 console
			new SchemaExport(cfg).create(true, true);
			}


}

Abraço a todos

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.

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:

hibernate.properties

hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost/serventeccorp
hibernate.connection.username = root
hibernate.connection.password = 
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.hbm2ddl.auto = update

Classe modelo:

import java.io.Serializable;
import javax.persistence.*;


@Entity
public class Usuario implements Serializable{
	//dados cadastrais
	@Id
	@GeneratedValue
	private Long id;
	
	@Column(name="ativo",updatable=true,nullable=true)
	private double ativo;
	
	@Column(name="nome",length=10,updatable=true,nullable=true)
	private String nome;
	
	@Column(name="sobrenome",length=40,updatable=true,nullable=true)
	private String sobrenome;
	
	@Column(name="email",length=40,updatable=true,nullable=true)
	private String email;
	
	@Column(name="login",length=20,updatable=true,nullable=true)
	private String login;
	
	@Column(name="senha",length=20,updatable=true,nullable=true)
	private String senha;
	
	@Column(name="perfil",length=20,updatable=true,nullable=true)
	private String perfil;

	
	
	
	//Getters and Setters
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getPerfil() {
		return perfil;
	}
	public void setPerfil(String perfil) {
		this.perfil = perfil;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getSobrenome() {
		return sobrenome;
	}
	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	

}

Grato pela atenção…

ErickRAR,

Realmente ele atualiza. Testei agora com os getters/setters devidamente declarados na classe modelo. Porém ele atualiza apagando todos os dados da tabela. Ou seja, tenho lá meu projeto rodando na empresa. Aí decidi que vou precisar de mais uma coluna na tabela usuario. Crio o atributo lá na minha classe modelo e mapeio ele no banco. Porém quando rodar o GeraTabelas ele vai adicionar a coluna, mas vai apagar todas as informações da tabela. Teria como simplesmente ele só adicionar a coluna sem apagar nada? Ou tenho que adicionar via SQL mesmo? Ou a melhor opção é deixar apagar tudo e depois recuperar o backup da tabela?

Abraço…

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.

ErickRAR,

Valeu pela atenção. Vou continuar investigando porque ele está apagando. Se conseguir qualquer coisa eu posto aqui.

Abraço…

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!

Abraço a todos…