Atualizar Tabela ao alterar entity do hibernate

11 respostas
R

Bom dia,

Estou com um problema ao usar o hibernate, estou desenvolvendo um sistema e ele esta na sua fase inicial de ideias e desenvolvimento, o que acarreta varias mudanças no banco de dados até chegar ao resultado desejado, porem quando eu insiro algum campo novo na entity ou crio algum relacionamento com outra o entity o hibernate nao reproduz isso no banco de dados, ou seja, ele nao executa um alter table para aplicar as alterações que fiz na entity, ae eu tenho que deletar o banco de dados e rodar o sistema novamente para que o hibernate recrie tudo com as alterações aplicadas, ae após isso tenho que importar todos os dados novamente, e isso tem que ser feito a cada alteração na entity, seja ela minima ou nao. Alguem sabe como resolver isso?

11 Respostas

B

seu hibernate.cfg.xml tem essa linha ?

<property name="hibernate.hbm2ddl.auto">update</property>
D

Bom, existe uma propriedade no hibernate que permite que ele crie e altere tabelas, é a hibernate.hbm2ddl.auto.
Ocorre que ela é meio radical.
Esta propriedade possui 3 opções de valor, create, create-drop e update.
A documentação é meio confusa e existe pouca informação sobre a mesma.
O que posso dizer é que os valores create e create-drop sempre apagam as tabelas criadas, quando há criação da session. Já o update apenas cria as tabelas caso elas ainda não existam. Até onde me lembro, mesmo com o nome update, ele realmente não faz o alter table…

T

Cara vc pode mostrar como esta o arquvio de configuraçao com o Banco.

Se vc Estiver usando hibernate puro tem um arquivo chamado hibernate.cfg.xml.
Se vc estiver usando hibernate + JPA o arquivo chama-se persistence.xml

R

galera, segue meu arquivo de configuração:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
		<property name="hibernate.connection.password">****</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/banco</property>
		<property name="hibernate.connection.username">teste</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>

		<!-- Entitys -->
		<mapping class="br.com.comparaescola.model.entity.Cidade" />
		<mapping class="br.com.comparaescola.model.entity.Curso" />
		<mapping class="br.com.comparaescola.model.entity.Estado" />
		
	</session-factory>
</hibernate-configuration>
T

Tenta mudar a Linha 12 para:

e ve se funciona.

D

tiago2109:
Tenta mudar a Linha 12 para:

e ve se funciona.


Isso pode ser perigoso.
Tenha certeza que a massa de dados pode ser dropada.

T

drsmachado:
tiago2109:
Tenta mudar a Linha 12 para:

e ve se funciona.


Isso pode ser perigoso.
Tenha certeza que a massa de dados pode ser dropada.

Bom ele disse que o banco ainda esta sendo montado então não há problema algum.

D

Sim, eu entendi. Agora, ele precisa ter total certeza disto. Além de que, precisará, obrigatoriamente, mudar isso para mandar para produção…

R

blz, jaja eu testo esta solução, mas mesmo que ela funcione ela não vai atender ao que eu preciso, pq agora tudo bem dropar o banco, mas futuramente nao poderei mais fazer isso, a ideia é só executar um alter table mesmo, sem perda dos dados. eu pensei aqui em algo mais manual mas que nao sei funciona, se algum de vcs ja fez isso e souber se da certo me diga por favor, se eu criar o campo novo na entity e depois ir no banco de dados e criar na mao este campo, o hibernate vai trata-lo normalmente ou nao ira reconhecer?

T

Opa eu Faço isso Todo dia sem problemas, e se vc criar uum relacionamento na Entity, pode ir no banco e criar na mão funciona noralmente tambe !!

R

Blz, então nao existe uma forma simples, automatica e gerenciada pelo hibernate para isso, a solução é ir na mão mesmo e ver no q da? uhauha

Criado 13 de dezembro de 2012
Ultima resposta 13 de dez. de 2012
Respostas 11
Participantes 4