Começando com Hibernate

5 respostas
M

Pessoal, estou seguindo um tutorial sobre Hibernate annotation, mas chegou em uma parte que não entendi o que é para fazer, veja:

[i][b]Configurando[/b][/i]
Nosso primeiro passo é configurar o hibernate, portanto iniciamos instanciando uma
org.hibernate.cfg.AnnotationConfiguration.
// Cria uma configuração para a classe Produto
AnnotationConfiguration cfg = new AnnotationConfiguration();
A partir daí podemos adicionar quantas classes desejarmos a nossa configuração.
// Adiciona a classe Produto
cfg.addAnnotatedClass(Produto.class);
No nosso caso iremos adicionar somente a nossa classe Produto, gerando o seguinte
resultado para configurar o Hibernate:
// Cria uma configuração para a classe Produto
AnnotationConfiguration cfg = new AnnotationConfiguration();
// Adiciona a classe Produto
cfg.addAnnotatedClass(Produto.class);
Só isso não é suficiente para que o Hibernate esteja configurado com a classe Produto.
O Hibernate requer que descrevamos como a classe se relaciona com as tabelas no banco de
dados e fizemos isso através das anotações do Hibernate.
Essa configuração poderia ser feita através de um arquivo xml chamado hibernate.cfg.xml.

Como faço esta configuração, não ficou bem explicado pra mim !!! eu crio uma classe ??? um arquivo xml ?? algum método ???

Ficou meio obscuro pra mim, e já procurei no google e todos que encontrei estão neste estilo tb, nenhuma explicação aprofundada !!! Acho q estão considerando que saibamos algo já !!! mas eu to aprendendo agora.

Valew

5 Respostas

sapulha

marceloplis, a questão é a seguinte, antes, no hibernate, vc tinha que criar um arquivo .cfg.xml onde vc configura questões como base de dados, controle de transação, dialect, quais hbm.xml vc usaria, essas coisas.

Agora, com annotations, vc tb deve configurar esse arquivo, que é o hibernate.cfg.xml.
A diferença é que ao invés de usar os arquivos de configuração hbm.xml que vc antes fazia para cada classe sua, agora vc adiciona diretamente os .class das suas classes.
Isso pode ser feito em runtime como no exemplo, ou diretamente nesse arquivo de configuração.

Dá uma procurada por hibernate.cfg.xml que vc vai esclarecer suas dúvidas.

M

Sapulha, pelo que entendi nesta parte, é que o arquivo xml seria uma opçãp, mas que neste exemplo ele não é usado, pois a parte de conexão com o BD está no hibernate.properties.

O que eu não entendi, é onde colocar o seguinte código ?? em qual arquivo que coloco ??

// Cria uma configuração para a classe Produto
AnnotationConfiguration cfg = new AnnotationConfiguration();
// Adiciona a classe Produto
cfg.addAnnotatedClass(Produto.class);

Valew.

M

Consegui me achar, era só ir mais adiante no tutorial que estava a resposta: :oops:

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class GeraTabelas {
	
	public static void main(String[] args){
		//Cria uma configuração para a classe produto
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Produto.class);
		new SchemaExport(cfg).create(true, true);
	}

}

Agora estou com outro problema, ao fazer esta classe fala que é só executá-la que a tabela seria criada !!! mas não está gerando e nem dando erro !! O que pode ser ???

Valew

Guerr

Esta configuração para a geração das tabelas constuma ficar no hibernate.cfg.xml… É uma propriedade que você coloca lá que habilita a criação das tabelas.

M

Então, mas acho que o propósito é justamente abandonar o xml, pois a declaração da criação de tabelas e dados está em ANNOTATION.

Para testes, criei a tabela na mão mesmo e está dando o seguinte erro:

IWAV0052E Invocation Target Exception creating pacote.AdicionaProduto
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.eclipse.ve.internal.java.vce.launcher.remotevm.JavaBeansLauncher.main(JavaBeansLauncher.java:79)
Caused by: org.hibernate.MappingException: Unknown entity: pacote.Produto
	at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:548)
	at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:96)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)

O que significa este erro ??

Obrigado.

Criado 4 de dezembro de 2006
Ultima resposta 4 de dez. de 2006
Respostas 5
Participantes 3