Livre-se do SQL: uma introdução ao Hibernate

125 respostas
P

Assunto: Cansado de trabalhar com SQL queries diferentes para cada banco de dados? O Hibernate é uma consagrada solução para persistência de objetos.

Você pode ler este artigo na íntegra aqui

Por favor, coloque os seus comentários sobre este artigo aqui.

125 Respostas

L

Legalzinho o hibernate.
Tenho uma duvida, porem, como ele trata relacionamento entre objetos?
Outra coisa, ao que me parece ele faz menos doque o jakarta toque faz, pq escolher ele e não o toque?

U

Muito bom o artigo, parabens :slight_smile:

P

“louds”:

Tenho uma duvida, porem, como ele trata relacionamento entre objetos?
Outra coisa, ao que me parece ele faz menos doque o jakarta toque faz, pq escolher ele e não o toque?

o torque difere completamente do hibernate em relacao a ser preso em compile time: voce decide que banco de dados vai usar em compile time. Se voce quiser mudar depois de banco de dados, vai ter de regerar codigo fonte, recompilar.

Com o hibernate, ou com o ojb, voce muda isso sem recompilar nada, basta mudar alguns properties e schemas.

C

Nossa, ficou muito bom o artigo, Daniel! Parabéns :smiley:

L

Nao vejo muito problema em ter que regenerar os arquivos em compile time, que vai fazer isso é o ant mesmo. :wink:

Enfim, ficou bem legal o artigo, mostra em claras linhas do que se trata o hibernate.

D

Muito obrigado pelos elogios de todos :smiley: .

D

Sobre ter ou não que recompilar:

  • se você não vê problema em ter que recompilar o projeto por causa de algumas mudanças e estiver mais acostumado com o Torque, fique com ele, mas saiba que o Hibernate lhe possibilita a mesma transparência persistente com o diferencial de não precisar recompilar;
  • se você acha que compilação é um processo chato (mesmo usando ANT), use o Hibernate :slight_smile: ;

Is this it? Oh yeah!!

T

No caso de utilizar o hibernate em aplicações web. Onde coloco os arquivos de configuração?

U

para ele achar sozinho, em WEB-INF/classes para você especificar, em qualquer lugar abaixo de WEB-INF assim garante nenhum client tenha acesso aos arquivos :slight_smile:

C

É geralmente uma boa prática fazer um .hbm.xml por classe mapeada colocar ele junto com a classe dentro do WEB-INF/classes, aliás :slight_smile:

BTW, o XDoclet faz isso sozinho :smiley:

C

Ah, falei do XDoclet mas não postei nenhuma URL… aqui vai a referência pro HibernadeDoclet:

http://xdoclet.sourceforge.net/tags/hibernate-tags.html

Se vc vai pegar pesado com o Hibernate, isso é quase essencial :smiley:

D

Oi, pessoal nao li o artigo todo, mas ele tava falando tao mal do sql que fazia o mesmo parece um bicho de set cabeças, quero deixar claro que programo em delphi com interbase e o sql tem sido a soluçao de muitos problemas, pois ele faz o que as linguagens de programaçao nao faz, que sao as pesquisas avancadas nos bancos de dados. Sou suspeito para falar, pois nao sei a dificuldade de uso do sql no java, mas para quem programa em delphi e vb, sql é a soluçao…

C

SQL nunca é uma solução elegante quando está misturado no meio do código ou nas suas definições de objetos. Leia de novo a última palavra: OBJETOS! Eu programo em Java, eu quero que as tabelas, PKs e FKs se fodam, literalmente, eu quero trabalhar com objetos. Com Collections. Arrays. Métodos. Esse tipo de coisa… mas ainda assim meu chefe me manda falar com o banco de dados. O que eu posso fazer? Lambuzar meu código de SQL ou usar uma ferramenta que faz isso pra mim e poupa o meu trabalho?

J

Não que o sql seja ruim… a questão é que se vc não usar sql diretamente em seu código, vc consegue tornar sua solução independente do banco de dados. Essa é a vantagem. Na verdade, internamente ele vai continuar lá…

Tudo bem, vc usa Interbase e blz. Mas e se quiser usar Oracle? Ou MySQL? … Essa é a questão chave. Vc não vai precisar mudar o seu aplicativo porque mudou de banco de dados.

Também programo em Delphi ( a 6 anos ) e desde que tenho começado a estudar Java, tenho aprendido alguns conceitos bem interessantes, que muitas vezes tenho empregado no próprio Delphi… e pode crer: Os conhecimentos de Java ajudaram a melhorar a qualidade de meus aplicativos em Delphi… :roll: É até engraçado isso… :smiley:

P

o J2Alex disse tudo…
nao eh que SQL seja ruim, mas misturar sql com java eh o mesmo que misturar html+php/asp+sql, coisa que sempre fazem. nao eh legivel, fica todo o model view controller sendo uma bola gigante e interdependente.

a questao eh a independecia e facilidade de manutencao.

L

e ae ?

gostei bastante do tutorial, muito bom, assim que tiver um tempo vou aplicar o exemplo !

uma pergunta :

O Hibernate e EJB, tem alguma relação proxima ?

falow ae

D

Desculpe, não entendi bem sua pergunta, mas se você quis perguntar se os EJBs fazem persistência de dados através de Hibernate, a resposta é NÃO.

C

“Daniel Quirino Oliveira”:

Desculpe, não entendi bem sua pergunta, mas se você quis perguntar se os EJBs fazem persistência de dados através de Hibernate, a resposta é NÃO.

Ué, o que tem de mal em usar o Hibernate num DAO, em um EJB BMP? Ou direto num Session Bean? Vai depender da tua arquitetura só :slight_smile:

U

a resposta é não, obrigatoriamente :slight_smile:

o JBoss por exemplo, pode ser configurado para utilizar o Hibernate para persistir os EJBs e não o JBossCMP (Se não me engano é este o modulo)
e você pode até especificar os descriptors para cada EJB :slight_smile:

D

Bom, por padrão não se usa. Usar em um Entity BMP seria uma ótima idéia, mas usar em um Session não é uma prática muito recomendável, pois você quebraria a cadeia de responsabilidades da arquitetura. Mas é possível :slight_smile: .

R

eu gostaria de dar os parabéns pelo artigo, ficoi muito bom!

caros colegas, estou enfrentando um problema com o hibernate, não consigo fechar a conexão. Tenho uma aplicação web com TomCat + Struts e estou usando o Eclipse como IDE.

Quando a minha requisição termina, eu tento fechar a conexão desta forma:
-> session.close(); // mas isto não é suficiente! A conexão não é fechada!

depois de usar a página muito tempo, eu recebo a mensagem “too many connections” do MySQL, pois as conexõe nunca são fechadas… elas só fecham se eu parar o TomCat. No MySQL vc pode ver o número de conexões com o comando: “show processlist;”

Façam um teste: façam uma aplicação Java normal com o hibernate: coloquem um breakpoint em session.close() e façam o debug no programa. Quando o debug parar no breakpoint, abra o DOS e entre no mysql, depois digite “show processlist;” para ver o número de conexões abertas. Então a sua conexão estará lá, OK tudo certo até aí! Depois passe pelo breakpoint! Agora a conexão deveria ser fechada! Pelo menos comigo não acontece, ou eu estou esquecendo alguma coisa! vc pode ver pelo mysql que a conexão ainda está lá… ela só fecha quando o programa do eclipse termina ou quando fecha o Tomcat…

façam o mesmo teste com o debug, só que substituam session.close(); por session.connection().close(); Este sim fecha a conexão!

Se alguém solber o que está acontecendo, ou se estou fazendo algo de errado me ajudem!

obrigado e parabéns pelo artigo

Ricardo

D

Hmmm… problema interessante. Isso parece ser um bug do hibernate (ou do driver do MySQL, quem sabe?). Tente contornar a situação adicionando o comando “session.connection().commit();” após cada “session.close();”, ok?

//... seu código session.flush(); session.close(); session.connection().commit(); }

Se mesmo assim não funcionar, tente usar o Hibernate com outro banco de dados (ou outro driver para o MySQL). Se o problema persistir, envie o bug ao pessoal do Hibernate, ok? A URL é: http://hibernate.bluemars.net/20.html

Hasta la vista

R

Perguntinha boba:

Usando o hibernate é possivel emular foreign key constraint no MySql?

C

Sim, é possível. Dê uma olhada na lista de features do Hibernate (algo me diz que essa lista é meio velha…) aqui: http://hibernate.sourceforge.net/features.html

B

Como eu mapeio auto relacionamentos, onde o item b é relacionado ao item a da mesma tabela ? :?

P

igual voce faz para tabelas diferentes: se for uma many-to-many, basta cria-la como propriedade da sua classe, e no “class” do mapeamento dessa colecao, voce escreve o proprio nome da sua classe! ele cria o foreign como magtica! :slight_smile:

D

Andei revendo o artigo e eu encontrei alguns errinhos, ambos no código da classe AmigoDAO:

  1. No construtor:
    :!: Errado:
//..
DataStore datastore = Hibernate.createDatastore();
//..

:arrow: Certo:

//..
Datastore datastore = Hibernate.createDatastore();
//..
  1. No método “public Amigo retrieve(String pk)”:
    :!: Errado:
//..
Amigo amigo = (Amigo)session.load(User.class, pk);
//..

:arrow: Certo:

//..
Amigo amigo = (Amigo)session.load(Amigo.class, pk);
//..

Desculpem pelos erros :wink: .

Abraços,

A

achei legal o tutorial, mas como sou “newbie” ainda em Java, nao entendi, alguem poderia me explicar algumas coisas…

eu ainda estou estudando Java, pra depois começar a trabalhar profissionalmente…
o que eu fiz até agora foi sempre usar JDBC puro, no maximo criar arquivos textos e depois atraves da classe Properties chamar eles, igual eu vi aqui no artigo retirando o sql do seu código fonte…

o que eu percebi, esse hibernate seria uma camada entre sua aplicação e o banco de dados???
eu vi que nao tem mais os comandos como Select, Insert, Update e etc…
e como que faz pra mim fazer um select utilizando joins?? sum, count e etc???

valeu…

B

Finalmente consegui testar o exemplo do artigo (com uma ajuda do Paulo) e
vou dar algumas dicas aqui:

Para compilar o exemplo vc precisa de umas bibliotecas:

http://jakarta.apache.org/commons/
Baixe essas três e coloque os .jar no seu CLASSPATH:

Commons Collections 2.1
Commons Lang 1.0.1
Commons Logging 1.0.3

as rotinas que eu usei:

public class Amigo {
	
	private String nome;
	private String endereco;
	private String telefone;
	private String celular;
	private String email;
	private java.util.Date nascimento;

	public Amigo(String nome,String end,String email) 
	{
		this.setNome(nome);
		this.setEndereco(end);
		this.setEmail(email);
	}
    
    public Amigo() 
    {
    	 
    }
    
	public String getNome(){
		return nome;
	}
    
	public void setNome(String nome){
		this.nome = nome;
	}
    
	public java.util.Date getNascimento(){
		return nascimento;
	}
    
	public void setNascimento(java.util.Date nascimento){
		this.nascimento = nascimento;
	}

	public String getCelular() {
		return celular;
	}

	public String getEmail() {
		return email;
	}

	public String getEndereco() {
		return endereco;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setCelular(String string) {
		celular = string;
	}

	public void setEmail(String string) {
		email = string;
	}

	public void setEndereco(String string) {
		endereco = string;
	}

	public void setTelefone(String string) {
		telefone = string;
	}

}
import cirrus.hibernate.*;
import java.util.*;

public class AmigoDAO{

	private SessionFactory factory;

	public AmigoDAO() throws Exception{
		Datastore datastore = Hibernate.createDatastore();
		datastore.storeClass(Amigo.class);
		factory = datastore.buildSessionFactory();
	}
    
	public void insert(Amigo amigo) throws Exception{
		Session session = factory.openSession();
		session.saveOrUpdate(amigo); 
		session.flush();
		session.close();
	}
    
	public List getList(String condicao) throws Exception{
		Session session = factory.openSession();
		List amigos = session.find(condicao);  
		session.flush();
		session.close();
		return amigos;
	}
    
	public Amigo retrive(String pk) throws Exception{
		Session session = factory.openSession();
		Amigo amigo = (Amigo)session.load(Amigo.class, pk);
		session.flush();
		session.close();
		return amigo;
	}
    
	public void delete(Amigo amigo) throws Exception{
		Session session = factory.openSession();
		session.delete(amigo);
		session.flush();
		session.close();
	}
}
public class testa {

    
	public static void main(String[] args) {
		 System.out.println(" ===== Teste do Hibernate =======");
		System.out.println("  ");
		 try 
		 {
			System.out.println(" Inserindo um registro... ");
			 Amigo a1= new Amigo("Come","Rua 13 de maio","[email removido]");
			 Amigo a2= new Amigo("Quieto","Rua 13 de maio","[email removido]");
		 	// cadastra registros
		 	AmigoDAO db=new AmigoDAO();
			db.insert(a1);
			db.insert(a2);
			// exibe registros
			System.out.println(" Exibindo registro [ "+a1.getNome()+"]");
			Amigo aux= db.retrive(a1.getNome());
			System.out.println(" Nome lido="+aux.getNome()+" Endereço lido="+aux.getEndereco());
			// atualiza registro
			System.out.println(" Atualizando um registro... ");
			a1.setEndereco("Rua 23 de maio");
			db.insert(a1);
			aux= db.retrive(a1.getNome());
			System.out.println(" Nome lido="+aux.getNome()+" Endereço lido="+aux.getEndereco());
		 }
		 catch (Exception E)
		 {
			System.out.println(" Erro : [ "+E.getMessage()+" ]");
		 }
		  
	}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-1.1.dtd">

<hibernate-mapping>
    <class name="Amigo" table="amigos">
        <id name="nome" column="nome" type="string" unsaved-value="null" >
            <generator class="assigned"/>
        </id>
        <property name="endereco" type="string"/>
        <property name="telefone" column="fone" type="string"/>
        <property name="celular" column="cel" type="string"/>
        <property name="email" type="string"/>
        <property name="nascimento" type="date"/>
    </class>
</hibernate-mapping>

Utilizei o MySQL como banco, Eclipse como IDE e Linux como SO.
Consegui rodar e realmente é bem interessante essa solução Hibernate.

O site para documentação é esse:

http://hibernate.bluemars.net

D

Eu sei que essa Thread já está meio vencida, mas só fui ler o tutorial do Hibernate agora.

Pelo que eu entendi, só lendo, sem testar, nem nada, o grande tchans desse cara é livrar meus DAOs dos selects/inserts/updates, além de me facilitar a vida caso eu queria mudar meu BD.

Isso mesmo, esqueci algo, há algo além do que o tutorial diz…?

C

Sim, tem mais um porém: o Hibernate te livra, finalmente, do caching! Agora, vc pode fazer selects mais complicadinhos que ante so eram performaticos se voce caprichasse no codigo do DAO ou usasse EJB CMP. Como o Hibernate se vira pra fazer cache dos resultados, qualquer codigo mais-ou-menos ja fica bom :slight_smile:

D

Hm… ok, Carlos, mas ainda assim me parece muita coisa para pouca coisa.

Quero dizer assim, eu vi alguns posts nesse tópico falando que SQL no código é ruim, etc e tal. Não acho o fim do mundo, se não for nada muito grande. Agora, se for muito grande, eu também não vou ter um trabalho danado pra criar todos os arquivos e classes necessários pro hibernate trabalhar direito?

Fica uma impressão de trocar seis por meia dúzia!!!

C

“dreamspeaker”:
Quero dizer assim, eu vi alguns posts nesse tópico falando que SQL no código é ruim, etc e tal. Não acho o fim do mundo, se não for nada muito grande. Agora, se for muito grande, eu também não vou ter um trabalho danado pra criar todos os arquivos e classes necessários pro hibernate trabalhar direito?

Fica uma impressão de trocar seis por meia dúzia!!!

Definitivamente não é trocar seis por meia-dúzia, ainda mais se vc estiver usando algum gerador de código, como XDoclet. Tem um doclet especifico pro Hibernate que gera os .hbm.xml pra voce, e faz isso de uma maneira bastante inteligente. Daí, putz, é questão de colocar uns atributos de JavaDoc no codigo, e vc há de convir comigo, é a coisa mais fácil do mundo, além de ficar bem-documentadinho :slight_smile:

D

Além do uso do XDoclet para gerar os mapeadores, o Hibernate possui feramentas que permite a criação dos beans a partir do esquema do seu banco de dados. Ou seja, menos código chato para se fazer.
Além disso, você pode criar uma estrutura interessante usando classes abstratas, livrando você de ter que codificar mais algumas coisinhas :slight_smile: .
Sobre ser ou não uma boa prática incluir SQL no meio do código Java, eu particularmente não acho uma prática muito interessante, visto que mudanças no esquema do banco podem ecoar muito profundamente na sua estrutura de classes :wink: .

Abraços

O

Livre-se do Hibernate… Use EJB 2.0 com CMR e EJBQL.

[]'s

D

“ozielneto”:
Livre-se do Hibernate… Use EJB 2.0 com CMR e EJBQL.

[]'s

Oziel, aproveita o embalo e monta um tutorial, também! :wink:

J

O EJB pode fazer a mesma coisa que o Hibernate? Se pode, não seria vantajoso usa-lo, pois não seria mais “padrão”? Não sei muito (nada) a respeito, mas me parece que no EJB há algumas limitações, no Hibernate isso também ocorre?

C

Hmmm… se vc me mostrar como usar EJB 2.0 com CMR e EJBQL numa aplicacao desktop (duas camadas), beleza, vc me convenceu :slight_smile:

U

CMR não funciona apenas para Entity Beans quando chamados de forma local??
como faço para refletir este mapeamento quando eu tiver que fazer uma chamada remota aos beans??
tenho que ter um session facade para criar VOs e enviar isto para o cliente??

D

[quote][quote:86a1613011]ozielneto escreveu:
Livre-se do Hibernate… Use EJB 2.0 com CMR e EJBQL. [/quote]

Hmmm… se vc me mostrar como usar EJB 2.0 com CMR e EJBQL numa aplicacao desktop (duas camadas), beleza, vc me convenceu [/quote]

Livre-se do J2EE: use Jini e JavaSpaces!
http://www.onjava.com/pub/a/onjava/2001/01/04/jini_enterprise.html

J

Perdão da ignorância, mas… porque livrar-se do J2EE??? :roll:

D

E

[quote]Perdão da ignorância, mas… porque livrar-se do J2EE??? /quote

Bom, Alexandre, primeiramente, toda a tecnologia tem limitação, logo não vai ser o hibernate que não vai ter. A principal limitação que eu vejo do Hibernate, principalmente qdo o comparam ao JDO, é que não há possibilidade de trabalhar com outros tipos de fontes de dados que não sejam bancos de dados relacionais. Seria muito interessante a possibilidade de persistir e recuperar objetos em arquivos comuns ou XML, por exemplo.
Agora, Hibernate pode fazer a mesma coisa que EJB (Entity Bean)? Sim, e com muitas vantagens (que o Oziel vai desmentir logo), como de poder fazer consultas usando funções de agregação (que são as funções max, count, min, avg, …), que ainda não existem no EJBQL (mas já estão especificadas para a versão 1.4 do J2EE). Além disso, você pode usar o Hibernate em lugares onde ter que usar um servidor de aplicações não seria muito conveniente. Em questão de performance, acho melhor ler isso: http://hibernate.bluemars.net/15.html.
Agora sobre a sua segunda citação “por que se livrar do J2EE?”, acho melhor você ler alguns debates que já rolaram sobre este tema aqui no fórum e alguns textos para que você forme sua PRÓPRIA opinião sobre o assunto. Abaixo segue a lista de links:

[]s

referências:
:arrow: http://www.javaworld.com/javaworld/jw-12-2001/jw-1207-yesnoejb.html
:arrow: http://guj.com.br/forum/viewtopic.php?t=2320

O

Segue um tutorial legal.

EJB CMP 2.0 Tutorial for Sun One AppServer 7.0 e Sun One Studio 4.0

www.oziel.com.br/artigos.html

Bom estudo.

N

Alguem pode me dizer como eu faço o download do Hibernate ?

Não consigo pelo site indicado… clico no link da versão e não faiz nada !!

R

http://sourceforge.net/project/showfiles.php?group_id=40712

N

Eu cheguei nessa página, mais quando clico no link hibernate-1.2.5.zip não contece nada, tanto nesse quanto nos outros, o unico que faz alguma coisa e clianco apenas na versão: 1.2.5

S

olá Pessoal,

Em uma aplicação J2EE usando MVC, vou usar o Struts como meu controler, desenolver meus EJBs pro model e usar o Velocity como View.

Durante o processo da transação meus EJBs vão ficar persistentes na Session mesmo … mas na hora de gravar a transação quero simplesmente passar meu EJB para o Hibernate (devidamente mapeado) pra ele salvar, é esse o caminho?

Durante a montagem das telas também quero que o Hibernate extrai os dados pros meus EJBs, mas esses não precisam de persistencia nem nada.

esse uso do Hibernate esta correto?

Obrigado

E

Olá… Eu estou tentando desenvolver uma aplicacao com Tomcat 4.0, Hibernate 1.2 e MySQL. O problema é que toda vez que eu tento acessar o banco de dados uma janela aparece com o seguinte erro: java.lang.UnsupportedOperationException, The user must supply a JDBC connection. Alguém sabe o que eu estou fazendo de errado? Valeu!

U

esqueceu de colocar no hibernate.properties os dados para conectar no banco (classe do driver, URL, nome de usuario, …)

E

Valeu… Na verdade eu tinha colocado o arquivo no lugar errado…

W

Baixei o hibernate e quero rodar o exemplo aqui do guj. Coloquei o arquivo hibernate2.jar no meu classpath, mas não consigo compilar o AmigoDAO.java. Não é possível localizar o hibernate.* no import, bem como as classes como SessionFactory, DataStore, etc…
Alguém sabe o que pode estar errado ?

D

Pelo visto você baixou a versão 2, do hibern8. Há algumas mudanças entre a versão 1 (que foi usada no tutorial) e a versão 2. Caso você queira usar o código do exemplo, recomendo que você baixe a versão 1.2.5 do hibernate.

[]s

p.s.: acho que já está na hora de eu escrever a versão 2 deste artigo. :wink:

W

Baixei e descompactar…coloquei o hibernate.jar no classpath, mas continua dando o mesmo erro…!!

D

Perai… hibernate.* ou cirrus.hibernate.*??

W

tirei o cirrus, pois é um package, não é isso ?
no meu código está só import hibernate.*;

preciso colocar no classpath também os arquivos commons-collections.jar, commons-lang.jar e commons-logging.jar como vi em um comentário do fórum ?

D

Sim, por cirrus ser o pacote onde está o pacote hibernate, você NÃO deveria tê-lo tirado de lá.
Copie e cole o código do tutorial, ajuste seu classpath e mande compilar. Testei aqui e tudo correu bem.

[]s

W

Beleza, consegui compilar…peguei uma aplicação aqui mesmo no forum e fiz algumas adaptações. O código está aí:

import java.util.Date;

public class testa {

public static void main(String[] args) {

System.out.println(" ===== Teste do Hibernate =======");

System.out.println("  “);

try

{

System.out.println(” Inserindo um registro… ");

Amigo a1= new Amigo();

a1.setNome(Wender);

a1.setEndereco(Rua Teste);

a1.setEmail([email removido]);

a1.setCelular(111111);

a1.setTelefone(222222);

a1.setNascimento(new java.util.Date());
AmigoDAO db=new AmigoDAO(); 
      db.insert(a1); 
     
      System.out.println(" Exibindo registro [ "+a1.getNome()+"]"); 
      Amigo aux= db.retrive(a1.getNome()); 
      System.out.println(" Nome lido="+aux.getNome()+" Endereço lido="+aux.getEndereco()); 
     
   } 
   catch (Exception E) 
   { 
     System.out.println(" Erro : [ "+E.getMessage()+" ]"); 
   }

}
}

Criei uma tabela no Oracle:
CREATE TABLE amigos
(nome VARCHAR2(40) NOT NULL,
endereco VARCHAR2(60) NOT NULL,
fone VARCHAR2(11) NOT NULL,
cel VARCHAR2(11) NOT NULL,
email VARCHAR2(70) NOT NULL,
nascimento DATE NOT NULL)
CONSTRAINT pk_amigos PRIMARY KEY (nome)
)

Meu arquivo xml:

<?xml version=“1.0”?>

<!DOCTYPE hibernate-mapping PUBLIC

“-//Hibernate/Hibernate Mapping DTD//EN”

“<a href="http://hibernate.sourceforge.net/hibernate-mapping.dtd">http://hibernate.sourceforge.net/hibernate-mapping.dtd</a>”>

<hibernate-mapping>

<class name=“Amigo” table=“amigos”>

<id name=“nome” column=“nome” type=“string”>

<generator class=“assigned”/>

</id>

<property name=“endereco” type=“string”/>

<property name=“telefone” column=“fone” type=“string”/>

<property name=“celular” column=“cel” type=“string”/>

<property name=“email” type=“string”/>

<property name=“nascimento” type=“date”/>

</class>

</hibernate-mapping>

Amigo.java

public class Amigo {

private String nome;

private String endereco;

private String telefone;

private String celular;

private String email;

private java.util.Date nascimento;
public Amigo() {
}

public String getNome(){
    return nome;
}

public void setNome(String nome){
    this.nome = nome;
}

public String getEndereco() { 
  return endereco;

}

public void setEndereco(String string) {

endereco = string;

}
public String getTelefone() {

return telefone;

}
public void setTelefone(String string) {

telefone = string;

}
public String getCelular() {

return celular;

}
public void setCelular(String string) {

celular = string;

}
public String getEmail() {

return email;

}
public void setEmail(String string) {

email = string;

}
public java.util.Date getNascimento(){
    return nascimento;
}

public void setNascimento(java.util.Date nascimento){
    this.nascimento = nascimento;
}

}

agenda.properties

hibernate.connection.driver_class = oracle.jdbc.driver.OracleDriver
hibernate.connection.url = jdbc:oracle:thin:@luv:1521:ora9des
hibernate.connection.username = usoluv
hibernate.connection.password = luvpk

O arquivo AmigoDAO.java está igual ao do site…

Daí aparece o seguinte erro quando rodo o testa.java:

01/09/2003 12:00:42 cirrus.hibernate.impl.DatastoreImpl storeClass

INFO: Mapping resource: Amigo.hbm.xml

01/09/2003 12:00:42 cirrus.hibernate.helpers.XMLHelper parseInputSource

INFO: Parsing XML: unknown system id

Exception in thread main java.lang.NoClassDefFoundError: org/apache/commons/c

llections/SequencedHashMap

at cirrus.hibernate.map.Table.<init>(Table.java:24)

at cirrus.hibernate.map.Root.addTable(Root.java:172)

at cirrus.hibernate.map.RootClass.<init>(RootClass.java:100)

at cirrus.hibernate.map.Root.<init>(Root.java:135)

at cirrus.hibernate.impl.DatastoreImpl.store(DatastoreImpl.java:106)

at cirrus.hibernate.impl.DatastoreImpl.storeInputStream(DatastoreImpl.j

va:116)

at cirrus.hibernate.impl.DatastoreImpl.storeClass(DatastoreImpl.java:14

)

at AmigoDAO.<init>(AmigoDAO.java:10)

at testa.main(testa.java:23)

Press any key to continue

Alguém já viu esse erro, minhas classes e arquivos listados acima estão certinhos ?

Pode me ajudar ?

D

Alo, galera, alguém aqui faz mapping one-to-one com foreign generator?

Eu to com a infeliz tarefa de gerar os objetos a partir da estrutura do banco, e tenho um mapping assim:

<id
            name="id"
            column="groupid"
            type="long"
            unsaved-value="null"
        >
            <generator class="foreign">
                <param name="property">group</param>
            </generator>
        </id>
...
<one-to-one
            name="group"
            class="de.commworld.usermanagement.dao.Group"
            cascade="none"
            outer-join="auto"
            constrained="false"
        />

Em algum lugar, tenho um codigo assim:

Group g = session.load(Group.class, id);
...
GroupStructure gs = new GroupStructure();
gs.setGroup(group);
session.save(gs);

E o maldito nao escreve no banco!!
Ja tentei milhares de coisas diferentes, mas nao rola… o log do hibernate diz que ele salvou a tal GroupStructure, mas no banco mesmo nao vejo nada…

K

Hehe tentei fazer um new topic e “tan…” nada.

Ninguem se interessa por OJB tambem?

http://db.apache.org/ojb

O esquema eh bem similar ao hibernate, e o plugin pra eclipse le o BD e ja gera .java e .xml .

D

Nesse forum os tópicos sao criados automaticamente (ou quase) quando um novo artigo ou tutorial é adicionado.

OJB é muito beta, e nao dava pra jogar fora os adicionais do Hibernate, tipo XDoclet e tal…

OJB é uma idéia boa, mas pareceu-me grande demais, e fora que com ele nao dava pra fazer o caminho do BD para os DAOs…

K

“dukejeffrie”:
Nesse forum os tópicos sao criados automaticamente (ou quase) quando um novo artigo ou tutorial é adicionado.

OJB é muito beta, e nao dava pra jogar fora os adicionais do Hibernate, tipo XDoclet e tal…

OJB é uma idéia boa, mas pareceu-me grande demais, e fora que com ele nao dava pra fazer o caminho do BD para os DAOs…

Eu to usando direto. Acho lindo.

D

Vc e eu somos pessoas OO, krico.

Meu estomago embrulha quando alguem me diz que um esquema do BD é maravilhoso e que os objetos java é que vao obedecer…

… que essa historia de ter que carregar o objeto na memoria, depois o outro, e chamar um metodo do primeiro usando o segundo como argumento, muito complicado, um JOINzinho resolveria…

…depois vem me agradecer pq eu refiz a HQL dele pra 1 linha.

Mas tem gente assim…

U

esta do HQL para uma linha é ótima mesmo,
aqui na empresa ja teve varios casos em que uma consulta SQL tinha 8 a 10 linhas, uma HQL que trazia o mesmo resultado tinha apeas 1 ou 1,5 no maximo :slight_smile:

K

“dukejeffrie”:

…depois vem me agradecer pq eu refiz a HQL dele pra 1 linha.

Mas tem gente assim…

Cara definitivamente alguem tem que escrever um tut. de OJB pro guj.
Como eu nao tenho nada pra fazer, acho que vou sentar e escrever um :wink:
Olha o que ele faz:

:arrow: ODMG 3.0
:arrow: JDO 1.0 (2.0 a caminho)
:arrow: PersistenceBroker API tipo

PersistenceBroker borker = PersistenceBroker.defaultBroker();
MyObject obj = new MyObject();

obj.setId(38); //Digamos que aqui id eh o PK de MyObject

obj.setX(...);
broker.beginTransaction(); //opcional
broker.store(obj);
broker.commitTransaction();//somente se o opcional rolou daaa.

// Em qualquer outro thread da mesma VM

Query q = QueryFactory.newQueryByPK(MyObject.class, 38);
MyObject obj2 = (MyObject) broker.getObjectByQuery(q);

if ( obj == obj2 ) //sempre true.  O mesmo objeto na memoria.

sei la, fiquei empolgado :wink:

beijocas na grosstitigen.

D

“urubatan”:
esta do HQL para uma linha é ótima mesmo,
aqui na empresa ja teve varios casos em que uma consulta SQL tinha 8 a 10 linhas, uma HQL que trazia o mesmo resultado tinha apeas 1 ou 1,5 no maximo :-)

Putz, cara, eu tava falando de um caso mais sério e mais grave. O do cara que nao quer aprender alguma coisa, fica dizendo que é uma bosta, que é lerdo, que é isso e aquilo, escreve um HQL de 3 linhas, quase um SQL, e depois eu viro pra ele e falo “mas isso é um objeto, vc pode fazer assim”, e transformo a HQL dele em uma HQL de uma linha.

Ontem teve tb o caso do

Collection cs = session.filter(select * ", g.getStructures());
Iterator it = cs.iterator();
while (it.hext()) {
   Group child = ((GroupStructure)it.next()).getGroup();
   ...
}

Eu olhei, olhei… “por que vc nao usa o método?”

Collection cs = session.filter(select group", g.getStructures());
Iterator it = cs.iterator();
while (it.hext()) {
   Group child = (Group)it.next();
   ...
}

Krico, que raio é uma grosstitigen?? : ))

Eu nao falei que OJB é ruim, falei que dessa vez nao deu pra usar. E aqui o pessoal encana muito com “betas”…

Aquelao!!

U

realmente, este é um problema grande :slight_smile:

esta é uma das coisas que gosto no JDO, ele te “obriga” a pensar em objetos na hora da consulta, ja que a linguagem de consulta é praticamente java :slight_smile:

e agora tem uma implementação free decente, não é open source, mas é muito boa :slight_smile:

http://www.jcredo.com pena que ainda não existia esta quando iniciei o artigo, e depois da ultima edição do artigo eles fizeram muito progresso :slight_smile:

K

“dukejeffrie”:

Krico, que raio é uma grosstitigen?? : ))

Aquelao!!

Huahuahua :lol: :oops: :twisted:

Tipo, voce ainda ta na alemanha?

Gross = grande
Titige = peituda

Uma vez o ale te mandou um e-mail e perguntou pra mim: “como se diz mulheres com grandes seios em alemao”

E eu disse Grosstitigenfrauen. Desde entaum, sempre que vejo voce em algum lugar lembro disto. Na verdade, ja ate foi incrementado para:

Grosstitigenharigbeinigefrauen

Pede pralgum “the germans” ler pra voce :twisted:

D

Chega! Tá off demais essa discussao. Respondo em PVT.

T

A ferramenta pra se criar beans no Hibernate seria o
SchemaExport???

Onde os beans gerados são guardados?

Eu executei aqui, não deu nenhum erro, mas procurei em diversos lugares
mas não encontrei.

Obrigado,

R

Olá:

Estou estudando o tutorial. e estou enfrentando alguns problemas:
:?: Estou usando como BD o PostgreSQL (e não o MySQL original do tutorial). O arquivo de Properties está assim:

hibernate.connection.driver_class = org.postgresql.Driver # o driver
hibernate.connection.url = jdbc:postgresql:hibernate # a url
hibernate.connection.username = Rafael U. C. Afonso # o username
hibernate.connection.password = # a senha
hibernate.dialect = cirrus.hibernate.sql.PostgreSQLDialect

Quando vou rodar o programa principal, obviamente incluo o Driver do PostgreSQL (pg73jdbc.jar) no classpath. Enretanto é soltada uma exceção:

O seja, não achou a classe org.postgresql.Driver, mas ela está dentro do JAR. O que pode estar havendo?

:?: Em relação ao arquivo *.hbm.xml: sempe que eu tentava rodar o programa, ele dizia que não conseguia localizar o tal XML. Somente quando o coloquei junto com os diretórios das classes é que este problema foi superado. Como faço para indicar a localização dos *.HBM.XML’s?

Grato,

C

Ele nao achou a classe chamada “org.postgresql.Driver # o driver” :wink:

Tire esse comentario do seu .properties e ja deve funcionar numa boa :smiley:

R

Vilella:

Deu certo! Pensei que o que viesse depois do “#” fosse considerado como comentário, mas pelo visto me enganei. :oops:

Grato,

A

Estou acompanhando o tutorial do hibernate e achei realmente interessante a possibilidade de livrar o SQL dos códigos internos do programa Java.
E quem fez o tutorial está de parabéns! :smiley:

Contudo, baixei a versão 2.0.3 do hibernate e estou com um probleminha: como faço para instalar ele?

Tem a ver com o classpath… que está configurado como c:j2sdkin e o JAVAC compila normalmente em qualquer lugar do Windows XP.

G

“krico”:
Grosstitigenharigbeinigefrauen

:lol: :lol: :lol: :lol: :lol:

gostei muito do tutorial… agora eh soh aplicar ele em todos os projetos que ja fiz (o tiagao q vai ter q sofrer…)

A

Repetindo: continuo apanhando feio do Hibernate…
Não consigo colocá-lo no classpath!!! :cry: :cry:

Mas não quero andar para trás, largar tudo!
Baixei o arquivo do Hibernate e extraí para a pasta c:\j2sdk\hibernate
E logo em seguida setei o Classpath para c:\j2sdk\hibernate

Ainda não entendi bem como funciona esse negócio de colocar arquivos java no classpath…
Peço a ajuda de vocês! Estaria muito agradecido…

A

Consegui arrumar o classpath, mas agora está dando o seguinte erro, do qual não consigo entender:

(...) Inserindo um registro... 05/10/2003 00:11:13 net.sf.hibernate.cfg.Environment <clinit> INFO: Hibernate 2.0.3 05/10/2003 00:11:13 net.sf.hibernate.cfg.Environment <clinit> INFO: loaded properties from resource hibernate.properties: {hibernate.connection.username=root, hibernate.connection.password=, hibernate.cglib.use_reflection_optimizer=false, hibernate.connection.url=jdbc:mysql://localhost/javabd, hibernate.connection.driver_class=com.mysql.jdbc.Driver} 05/10/2003 00:11:13 net.sf.hibernate.cfg.Environment <clinit> INFO: JVM proxy support: true 05/10/2003 00:11:13 net.sf.hibernate.cfg.Configuration addClass INFO: Mapping resource: Amigos.hbm.xml 05/10/2003 00:11:14 net.sf.hibernate.cfg.Configuration addInputStream SEVERE: Could not configure datastore from input stream org.dom4j.DocumentException: null Nested exception: null at org.dom4j.io.SAXReader.read(SAXReader.java:358) at net.sf.hibernate.cfg.Configuration.addInputStream(Configuration.java:252) at net.sf.hibernate.cfg.Configuration.addClass(Configuration.java:286) at AmigosDAO.<init>(AmigosDAO.java:11) at Executa.main(Executa.java:10) Nested exception: java.lang.NullPointerException (...)

O código-fonte usado é o do tutorial, com algumas pequenas alterações, já que a versão mais recente do hibernate não tem a classe Datastore (ao que me parece). São as alterações do arquivo AmigosDAO.java:

(...)
	public AmigosDAO() throws HibernateException{ 
		Configuration cfg = new Configuration()
			.addClass(Amigos.class);
		factory = cfg.buildSessionFactory();
	} 

  public void insert(Amigos amigo) throws Exception{
    Session session = factory.openSession();
    session.save(amigo);
    session.flush();
    session.close();
  }
(...)
D

Para aqueles que estiverem com dificuldades em portar aplicações usando o Hibernate 1.x.x para o Hibernate 2.x.x, visite: http://hibernate.org/68.html.

F

estou com dificuldades de usar o hibernate.

como estou seguindo o tutorial aqui do guj não estou encontrando as classes especificadas no tutorial(o classpath já está confiogurado corretamente)
Como por exemplo a DataStore.

obs.: estou usando a versão 2.1

obrigado

E

Gostei do artigo, relamente o sql suja muito, mas tenho uma dúvida, tenho uma classe que cuida disso por exemplo para fazer um insert tenho um metodo que recebe uma array de objetos contendo os valores e um outro com os nomes dos campos e ele mosta a sql e executa, vcs acha esse tipo de coisa ruim tambem? No meu codigo,exeto nessa classe, não tenho sql algum.

R

Parece que vc tem algum como um “construtor de queries”, nao?! A ideia geral de usar, digamos assim, tecnicas de separacao de responsabilidades/tarefas, eh tornar a vida do programador mais facil, pois quando precisar alterar alguma coisa no sistema, nao sera necessario sair cacando por todo o codigo fonte coisas a mudar…

Por exemplo, deixando as queries em um arquivo texto a parte, voce sabe que, se alguma coisa mudar em alguma delas, eh soh ir no tal arquivo e alterar a query la… soh la.

Construtores de queries sao uteis quando, em tempo de desenvolvimento, voce nao sabe quais campos serao necessarios… um exemplo disso sao buscas dinamicas, onde o usuario escolhe os filtros e quais campos gostaria de ver…

Mas, em todos os campos, eh importante fazer pensando sempre em reusabilidade e facilidade de manutencao… afinal, se alguem tiver que por a mao na massa quando precisar arrumar algo, esse “alguem” seremos nos, programadores :)…

Rafael

S

Queria expor a seguinte situacao:
Eu tenho uma tabela de clientes uma de produtos e uma de pedidos. todas com uma grande quantidade de registros. Presumindo que eu precise fazer uma rotina para selecionar todos os cliente que compraram “bolinhas de gudes azuis” no dia 01/01/2003…

Como o Hibernate me traria os objetos??? Collection de clientes??? E possivel fazer isso??? Qual seria a melhor solucao para problemas semelhantes???

N

Conseguo compilar meus códigos e quando vou testar dá o seguinte erro

java teste
Exception in thread "main" java.lang.NoClassDefFoundError: cirrus/hibernate/Hibernate
at AmigoDAO.(AmigoDAO.java:10)
at teste.main(teste.java:14)

Taí meus fontes que peguei do tutorial e de um membro aqui do GUJ:

AmigoDAO.java
import cirrus.hibernate.*;
import java.util.Date;

public class AmigoDAO{

   private SessionFactory factory;


   public AmigoDAO() throws Exception{
      Datastore datastore = Hibernate.createDatastore();
      datastore.storeClass(Amigo.class);
      factory = datastore.buildSessionFactory();
   }

   public void insert(Amigo amigo) throws Exception{
      Session session = factory.openSession();
      session.saveOrUpdate(amigo);
      session.flush();
      session.close();
   }

   public List getList(String condicao) throws Exception{
      Session session = factory.openSession();
      List amigos = session.find(condicao);
      session.flush();
      session.close();
      return amigos;
   }

   public Amigo retrive(String pk) throws Exception{
      Session session = factory.openSession();
      Amigo amigo = (Amigo)session.load(Amigo.class, pk);
      session.flush();
      session.close();
      return amigo;
   }

   public void delete(Amigo amigo) throws Exception{
      Session session = factory.openSession();
      session.delete(amigo);
      session.flush();
      session.close();
   }
}
teste.java
public class teste {

   public static void main(String[] args) {
       System.out.println(" ===== Teste do Hibernate =======");
      System.out.println("  ");
       try
       {
         System.out.println(" Inserindo um registro... ");
          Amigo a1= new Amigo("Come","Rua 13 de maio","[email removido]");
          Amigo a2= new Amigo("Quieto","Rua 13 de maio","[email removido]");
          System.out.println("Passou por aqui!!!");
          // cadastra registros
          AmigoDAO db=new AmigoDAO();
         db.insert(a1);
         db.insert(a2);
         // exibe registros
         System.out.println(" Exibindo registro [ "+a1.getNome()+"]");
         Amigo aux= db.retrive(a1.getNome());
         System.out.println(" Nome lido="+aux.getNome()+" Endereço lido="+aux.getEndereco());
         // atualiza registro
         System.out.println(" Atualizando um registro... ");
         a1.setEndereco("Rua 23 de maio");
         db.insert(a1);
         aux= db.retrive(a1.getNome());
         System.out.println(" Nome lido="+aux.getNome()+" Endereço lido="+aux.getEndereco());
       }
       catch (Exception E)
       {
         System.out.println(" Erro : [ "+E.getMessage()+" ]");
       }

   }
}

Tô usando o hibernate 1.2.5, taí tb meu bat para compilar as classes AmigoDAO e teste (coloquei a barra invertida porque a outra não funciona aqui no fórum, deve ser por causa do HTML)

javac -classpath c:/hibern~1.2/hibernate.properties;c:/hibern~1.2/lib/commons-lang.jar;c:/hibern~1.2/hibernate.jar;c:/hibern~1.2 AmigoDAO.java
javac -classpath c:/hibern~1.2/hibernate.properties;c:/hibern~1.2/lib/commons-lang.jar;c:/hibern~1.2/hibernate.jar;c:/hibern~1.2 teste.java

F

Aqui que entra a chave do Hibernate…se vc faz isso com delphi de utilizar varios bancos…tu usa sql padrão ai a performance vai pro saco…em java deixando pros carinha de persistencia hibernate, torque ou algum do genero…que geram sql nativo aos banco melhorando a performance…
IMHO - E pode ter certeza quem faz essas “ferramentas” de persistencia entende de SQL muito mais do que quem trabalha so quem Objetos…( eu so meio suspeito pra falar isso, mas tudo blz hehehe ) :slight_smile:

[]'s

Fabio Patricio
Desenvolvedor Oracle/ Java

A

:roll:
Estou tendo muita dificuldade em portar o exemplo do tutorial do hibernate para a nova versão do Hibernate.

Não consegui compreender o texto do: http://hibernate.org/68.html.

Será que vcs pode me dar uma ajudadinha me mostrando mais claramente oque muda de uma versão para outra do hibernate eo que muda no exemplo do código do GUJ???

Outra coisa, estou trabalhando com o pool, como que fica este trecho:
hibernate.connection.driver_class = org.gjt.mm.mysql.Driver # o driver
hibernate.connection.url = jdbc:mysql://localhost:3306/agenda # a url
hibernate.connection.username = daniel # o username
hibernate.connection.password = senha # a senha

sendo que a conexão deve ser feita pelo meu DataSource e não pelo hibernate??? (ou não tem nada haver, o DataSource conecta com minha aplicação e a instrução acima faz só a associação do hibernate com o BD?)

Desculpa se são perguntas tolas, mas é porque sou leigo nesta tecnologia e gostaria de saber mais…

E

E ai galera,

Estou tentando rodar o exemplo, mas está aparecendo o seguinte erro:

SEVERE: Could not synchronize database state with session net.sf.hibernate.HibernateException: SQL insert, update or delete failed (row not found)
Este erro é exatamente no momento de dar o comando session.flush().
Estou usando o hibernate 2.1.

Falou,
Éber Teles.

P

Achei a ideia do Hibernate muito interessante e resolvi testar o exemplo da materia porem na linha

Datastore datastore = Hibernate.createDatastore();

O proprio eclipse me indica 2 erros:

  1. Datastore cannot be resolved or is not a type
  2. The method createDatastore() is undefined for the type Hibernate

Estou utilizando o jar contido no hibernate 2.1

Alguem sabe o que pode estar errado?

P

Para quem teve o mesmo problema que eu ao utilizar a versão 2.1 para testar o artigo troque o trecho:

Datastore datastore = Hibernate.createDatastore();
datastore.storeClass(Cliente.class);
factory = datastore.buildSessionFactory();

por:

Configuration cfg = new Configuration();
cfg .addClass(Cliente.class);
SessionFactory factory = cfg.buildSessionFactory();

E não esqueça de importar net.sf.hibernate.cfg.Configuration :slight_smile:

A

O Hibern8 ta me dando um nó na cabeça :cry:

To pastando para realizar uma consulta com join com o HQL.

Eu tenho a tabela/classe produto, fornecedor e uma de relacionamento produto_fornecedor

Quero exibir o nome de todos os produtos com seus respectivos fornecedores.

Criei os mappings e os beans tudo certinho; Para o relacionamento criei uma classe produto_fornecedorPK com o id das duas classes, e criei a classe de relacionamento produto_fornecedor com um atributo id que é do tipo produto_fornecedorPK.

Mas como que eu faço agora a bendita consulta??? :lol:

U

faz os teus mapeamentos novamente, um objeto tem que apontar para o outro objeto e não para o ID dele.

tu vai ver que desta forma fica muito mais fácil :slight_smile:

A

“urubatan”:
faz os teus mapeamentos novamente, um objeto tem que apontar para o outro objeto e não para o ID dele.

tu vai ver que desta forma fica muito mais fácil :-)

:P´Rodrigo,

É isso que estou fazendo, o id do mapping Produto_fornecedor esta apontando para Produto_fornecedorPK.class que é um bean que tem como atributo um objeto do tipo Produto e outro do tipo Fornecedor.

O problema esta em como escrever a HQL, eu não sei

Veja o meu mapping do relacionamento:

<hibernate-mapping>

<class name=“com.siq.DBTest.data.model.SiqGrpPapeis” table=“SIQ_GRP_PAPEIS”>

<composite-id name=“id” class=“com.siq.DBTest.data.model.SiqGrpPapeisPK”>

<key-many-to-one name=“SiqGrp” column=“idGrp” class=“com.siq.DBTest.data.model.SiqGrp” />

<key-many-to-one name=“SiqPapeis” column=“idPapeis” class=“com.siq.DBTest.data.model.SiqPapeis” />

</composite-id>

</class>

</hibernate-mapping>
A

foi mal, mandei um mapping de um relacionamento entre grupos e papeis do grupo.

Mas a dúvida é a mesma que a para o caso de produtos x fornecedores.

Como montar a consulta HQL !!! :x

M

Parabéns ao GUJ. Muito legal esse site. Gostei muito do conteúdo.

Bem, tenho um problema com o Hibernate/Struts/JSP/MySql. Consegui fazê-lo funcionar mas não da forma que eu gostaria.

Estou instanciando o Bean do Hibernate da seguinte forma em uma JSP:

<%

List itemList = ItemService.getInstance().getItemList();

request.setAttribute(items, itemList);

%>

Com isso eu obtenho a conexão com o banco e todos os itens da tabela e gravo em uma Session (eu acho, não tenho certeza).
Para mostrar a tabela inteira eu estou fazendo da seguinte forma:

<logic:iterate id=“element” name=“items” scope=“request” type=“app.Item” >
<tr>
<td><bean:write name=“element” property=“id” /></td>
<td><bean:write name=“element” property=“nrprocesso” /></td>
<td><bean:write name=“element” property=“name” /></td>
<td><bean:write name=“element” property=“description” /></td>
</tr>

O problema é que eu gostaria de mostrar somente os itens do usuário que está logado. Os dados do usuário que está logado eu preservo em um Bean de Seção mas não sei como passar esses dados para o hibernate. Eu teria que, no momento da criação da lista, passar uma chave para o Hibernate selecionar o que eu quero. Selecionar os daque eu quero não é problema, o problema é, a apartir do JSP, passar parametros para o Hibernate.

Agradeço muito qualquer ajuda.

C

Pessoal, estou tentando executar o exemplo do tutorial mas sempre obtenho este erro

[color="red"]java.lang.UnsupportedOperationException: The user must supply a JDBC connection
at net.sf.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:32)
at net.sf.hibernate.impl.BatcherImpl.openConnection(BatcherImpl.java:286)
at net.sf.hibernate.impl.SessionImpl.connect(SessionImpl.java:3326)
at net.sf.hibernate.impl.SessionImpl.connection(SessionImpl.java:3286)
at net.sf.hibernate.impl.BatcherImpl.prepareStatement(BatcherImpl.java:61)
at net.sf.hibernate.impl.BatcherImpl.prepareStatement(BatcherImpl.java:56)
at net.sf.hibernate.impl.BatcherImpl.prepareBatchStatement(BatcherImpl.java:109)
at net.sf.hibernate.persister.EntityPersister.insert(EntityPersister.java:460)
at net.sf.hibernate.persister.EntityPersister.insert(EntityPersister.java:442)
at net.sf.hibernate.impl.ScheduledInsertion.execute(ScheduledInsertion.java:29)
at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2418)
at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2371)
at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2240)
at src.AmigoDAO.insert(AmigoDAO.java:22)
at src.App.main(App.java:19)[/color]

Este é o hibernate.cfg.xml:

<hibernate-configuration>
    <session-factory >

		<!-- local connection properties -->
		<property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/:mes</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password"></property>
		<!-- property name="hibernate.connection.pool_size"></property -->

		<!-- dialect for MySQL -->
        <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>

        <property name="hibernate.show_sql">false</property>
        <property name="hibernate.use_outer_join">true</property>
        <property name="hibernate.transaction.factory_class">net.sf.hibernate.transaction.JTATransactionFactory</property>
        <property name="jta.UserTransaction">java:comp/UserTransaction</property>

		<!-- Mapping files --> 
		<mapping resource="Amigo.hbm.xml"/> 
    </session-factory>
Este é o meu código que insere o amigo:
Amigo amigo=new Amigo(  );
		amigo.setNome( "Andre" );
		amigo.setNascimento( new Date(  ) );

		AmigoDAO amigoDAO;

		try
		{
			amigoDAO=new AmigoDAO(  );
			amigoDAO.insert( amigo );
		}
		catch( Exception e )
		{
			e.printStackTrace();
		}
E

Daniel vlw por ter me dado a introdução a Hibernate no Conexão java, quebrou mesmo um galhão aki…

A

10 x 0 para o hibernate…

Estou desde ontem tentando fazer o hibernate funcionar aqui… primeiro um monte de erro sem sentido que sumiram sei lá por que… agora um erro tosco sem noção… ele não acha o jdbc driver do mysql… sendo que ESTA no classpath só que se eu mudo para o DB2 funciona, detalhe os dois drives estão na mesma pasta…

Da para entender isso?

Aproveitando… como lido com chave composta?

Assim estou tentando usar o hibernate pela primeira vez e até agora só vi exemplo com chave primeira simples…

;o/

T

De uma olhada em <composite-id> no reference do hibernate…

Mas pessoalmente, recomendaria o uso de apenas chaves simples… É claro que as vezes nós não podemos fazer isso devido ao banco ser legado ou algo parecido!

Qualquer duvida com o composite-id posta aí!!

Fallow

A

Ahhhhh vou ter um ataque de nervos… cada hora uma coisa nova…

2004-08-18 12:19:58,892 INFO hibernate.cfg.Environment -> Hibernate 2.1.4 2004-08-18 12:19:58,943 INFO hibernate.cfg.Environment -> loaded properties from resource hibernate.properties: hibernate.connection.password=minhasenha, hibernate.query.imports=net.sf.hibernate.test, net.sf.hibernate.eg, hibernate.query.substitutions=true 1, false 0, yes 'Y', no 'N', hibernate.dbcp.whenExhaustedAction=1, hibernate.show_sql=true, hibernate.proxool.pool_alias=pool1, hibernate.jdbc.batch_size=0, hibernate.dbcp.testOnBorrow=true, hibernate.dbcp.ps.maxActive=100, hibernate.jdbc.use_streams_for_binary=true, hibernate.connection.username=meuusuario, hibernate.dbcp.maxActive=10, hibernate.dbcp.ps.whenExhaustedAction=1, hibernate.dbcp.maxIdle=10, hibernate.connection.driver_class=COM.ibm.db2.jdbc.app.DB2Driver, hibernate.dbcp.ps.maxIdle=100, hibernate.dbcp.maxWait=120000, hibernate.dbcp.ps.maxWait=120000, hibernate.cglib.use_reflection_optimizer=true, hibernate.dialect=net.sf.hibernate.dialect.DB2Dialect, hibernate.connection.url=jdbc:db2:DB2DESENV 2004-08-18 12:19:58,943 INFO hibernate.cfg.Environment -> using java.io streams to persist binary types 2004-08-18 12:19:58,953 INFO hibernate.cfg.Environment -> using CGLIB reflection optimizer 2004-08-18 12:19:58,973 INFO hibernate.cfg.Configuration -> Mapping resource: com/itau/sms/cliente/Cliente.hbm.xml 2004-08-18 12:20:00,639 INFO hibernate.cfg.Binder -> Mapping class: com.itau.sms.cliente.Cliente -> DB2CAS.TBGOTSM0 2004-08-18 12:20:00,930 INFO hibernate.cfg.Configuration -> processing one-to-many association mappings 2004-08-18 12:20:00,930 INFO hibernate.cfg.Configuration -> processing one-to-one association property references 2004-08-18 12:20:00,940 INFO hibernate.cfg.Configuration -> processing foreign key constraints 2004-08-18 12:20:01,021 INFO hibernate.dialect.Dialect -> Using dialect: net.sf.hibernate.dialect.DB2Dialect 2004-08-18 12:20:01,031 INFO hibernate.cfg.SettingsFactory -> Use outer join fetching: true 2004-08-18 12:20:01,061 INFO hibernate.connection.DBCPConnectionProvider -> DBCP using driver: COM.ibm.db2.jdbc.app.DB2Driver at URL: jdbc:db2:DB2DESENV 2004-08-18 12:20:01,061 INFO hibernate.connection.DBCPConnectionProvider -> Connection properties: {user=meuusuario, password=minhasenha} 2004-08-18 12:20:01,342 INFO hibernate.connection.DBCPConnectionProvider -> DBCP prepared statement pooling enabled 2004-08-18 12:20:01,392 INFO hibernate.transaction.TransactionManagerLookupFactory -> No TransactionManagerLookup configured (in JTA environment, use of process level read-write cache is not recommended) java.lang.AbstractMethodError: COM.ibm.db2.jdbc.app.DB2DatabaseMetaData.supportsResultSetType(I)Z at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:75) at net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1132) at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:766) at com.itau.sms.cliente.TesteCliente.main(TesteCliente.java:28) Exception in thread "main"

DB2 = 7.2

O que isso significa?

A

Depois do esmagador silêncio de pertubar o Paulo, o Caio, o Chico Bento e muitos outros via ICQ consegui resolver o problema ;D

Vamos a solução…

No google encontrei apenas duas referencias ao problema sendo que uma dizia o mesmo que o Paulo que algum jar estava desatualizado como funcionou usando o mysql logo o driver problematico seria do DB2… a versão do DB2 que estou usando é a 7.2 e por padrão vem do o driver para JDBC1 (coisa que eu não fazia idéia), sendo assim teria que atualizar o driver… bem… não achei em lugar nenhum onde faze-lo nem mesmo no site da IBM mais achei uma instrução ridicula de tão simples…

To enable JDBC 2.0 use on Windows NT systems:

Run the following batch file:
C:/SQLLIB/java12/usejdbc2.bat
(In some cases, the file is named jdbc20.exe.)

Stop WebSphere Application Server (if it is running) and start it again.

Pronto fiz isso e esta funcionando ;o)

Resumindo pelo que li este erro indica que o driver esta usando uma versão antiga do jdbc.

J

Estou tentando rodar o exemplo do Hibernate do tutorial e não consigo.

esta dando um erro na seguinte linha de comando:

Datastore datastore = Hibernate.createDatastore();
B

Alguem ai afim de me mostrar um mapeamento de uma relacao ternaria usando xdoclet ? No meu caso , tenho minhas tabelas fornecedor, produto, loja e suas respectivas classes. Desde ja agradeco qm tiver afim de quebrar esse galhao pra mim 8)

E

Po tbm n consigo rodar o exemplo…

F

Aaahhhh, o link do artigo tá quebrado!!!

Tem algum outro link??? :smiley:

B

Daniel Quirino Oliveira:
Hmmm… problema interessante. Isso parece ser um bug do hibernate (ou do driver do MySQL, quem sabe?). Tente contornar a situação adicionando o comando “session.connection().commit();” após cada “session.close();”, ok?

//... seu código session.flush(); session.close(); session.connection().commit(); }

Se mesmo assim não funcionar, tente usar o Hibernate com outro banco de dados (ou outro driver para o MySQL). Se o problema persistir, envie o bug ao pessoal do Hibernate, ok? A URL é: http://hibernate.bluemars.net/20.html

Hasta la vista

Meio tarde pra trazer isso a tona, mas estava com esse problema de o simples session.flush(); session.close() não estarem commitando com o MySQL, dei uma fuçada e acabei verificando que esse problema está relacionado com o tipo de tabela do mysql. As tabelas que não suportam transações precisam do treço de código abaixo para serem comitadas.

session.flush(); session.connection().commit(); session.connection().close(); /* Provavelmente o session.flush é redundante, não testei, mas assim está funcionando */

Para as que suportam o código do tutorial deve funcionar… alguém teste, se tiver interesse e tempo livre.

Fonte:


No transactions with MyISAM tables, only with InnoDB tables (consider changing the default for your databases).

http://www.hibernate.org/80.html

C

O session.flush() não é redundante não, ele apenas sincroniza o estado dos objetos alterados com o estado dos dados da tabela, sem fazer commit da transação.

[]'s

I

-- EDITADO --
Galera, fiz rodar, mais info abaixo
-------------------------------------------------
Botei o dialect e transformei a table para mysam, ai rodou...
Agora fica a pergunta, e se eu quisesse usar innodb?
-------------------------------------------------

Fala pessoal, tudo certo?
Estou tendo um problema um tanto quanto muito demais estranho... hehehehe
Seguinte, estou usando o hibernate 2.1, todos os libs no classpath, jar do hibernate no classpath tb.
Todas as classes (Amigos, DAO, e teste) estão compilando, porém, quando vou rodar o teste ele me mostra alguns erros e tchanam... quando eu abro o banco não tem NADA!!!
segue os arquivos.
Mal ae pelo plágio de alguns testes do pessoal, mas isso é somente para aprendizado.

arquivo DAO
public class AmigosDAO {
    
    private SessionFactory factory;
    
    public AmigosDAO() throws HibernateException{
        Configuration cfg = new Configuration().addClass(Amigos.class);
        factory = cfg.buildSessionFactory();
                
    }
    
    public void insert(Amigos amigo) throws Exception{
        Session session = factory.openSession();
        session.save(amigo);
        session.flush();
        session.close();
    }
    
    public java.util.List getList(String condicao) throws Exception{
        Session session = factory.openSession();
        List amigos = session.find(condicao);
        session.flush();
        session.close();
        return amigos;
   }
    
    public Amigos retrieve(String pk) throws Exception{
        Session session = factory.openSession();
        Amigos amigo = (Amigos)session.load(Amigos.class, pk);
        session.flush();
        session.close();
        return amigo;
    }
    
    public void delete(Amigos amigo) throws Exception{
        Session session = factory.openSession();
        session.delete(amigo);
        session.flush();
        session.close();
    }

}
Arquivo Amigos
public class Amigos {
    private String nome;
    private String endereco;
    private String telefone;
    private String celular;
    private String email;
    private java.util.Date nascimento;
    

    public Amigos(){
        
    }
    public Amigos(String nome, String endereco){
        
    }
    
    /**
     * @return Returns the celular.
     */
    public String getCelular() {
        return celular;
    }
    /**
     * @return Returns the email.
     */
    public String getEmail() {
        return email;
    }
    /**
     * @return Returns the endereco.
     */
    public String getEndereco() {
        return endereco;
    }
    /**
     * @return Returns the nascimento.
     */
    public java.util.Date getNascimento() {
        return nascimento;
    }
    /**
     * @return Returns the nome.
     */
    public String getNome() {
        return nome;
    }
    /**
     * @return Returns the telefone.
     */
    public String getTelefone() {
        return telefone;
    }
    /**
     * @param celular The celular to set.
     */
    public void setCelular(String celular) {
        this.celular = celular;
    }
    /**
     * @param email The email to set.
     */
    public void setEmail(String email) {
        this.email = email;
    }
    /**
     * @param endereco The endereco to set.
     */
    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }
    /**
     * @param nascimento The nascimento to set.
     */
    public void setNascimento(java.util.Date nascimento) {
        this.nascimento = nascimento;
    }
    /**
     * @param nome The nome to set.
     */
    public void setNome(String nome) {
        this.nome = nome;
    }
    /**
     * @param telefone The telefone to set.
     */
    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
}

Uma curiosidade, ele fala que por default, o constructor tem que ser vazio, alguém sabe o motivo? E se eu coloco os dois, ele fala que os parametros tem que ser definidos manualmente.

Arquivo testeamigos
public class MeusAmigos {

    public static void main(String[] args) {
        System.out.println("===== Teste do hibernate =====");
        System.out.println("");
        
        try {
            System.out.println("Inserindo um registro");
            Amigos amigo1 = new Amigos();
            Amigos amigo2 = new Amigos();
            amigo1.setNome("eu");
            amigo1.setEndereco("aqui");
            amigo2.setNome("Ele");
            amigo2.setEndereco("la");
            // cadastra registros
            AmigosDAO dao = new AmigosDAO();
            dao.insert(amigo1);
            dao.insert(amigo2);
            // exibe registros
            System.out.println("Exibindo registros [ " + amigo1.getNome() + " ]");
            Amigos mostra = dao.retrieve(amigo1.getNome());
            System.out.println("Nome lido: " + mostra.getNome() + " Endereco lido: " + mostra.getEndereco());
            // atualiza registro
            System.out.println("Atualizando um registro");
            amigo1.setEndereco("Rua 21 de abril");
            dao.insert(amigo1);
            mostra = dao.retrieve(amigo2.getNome());
            System.out.println("Nome lido: " + mostra.getNome() + " Endereco lido: " + mostra.getEndereco());
            
        } catch (Exception e){
            System.out.println("Erro: [ " + e.getMessage() + " ] ");
        }
    }
}
xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping.dtd">
<hibernate-mapping>
<class name="Amigos" table="amigos">
<id name="nome" column="nome" type="string">
<generator class="assigned"/>
</id>
<property name="endereco" type="string"/>
<property name="telefone" column="fone" type="string"/>
<property name="celular" column="cel" type="string"/>
<property name="email" type="string"/>
<property name="nascimento" type="date"/>
</class>
</hibernate-mapping>
properties
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost:3306/banco
hibernate.connection.username = 
hibernate.connection.password =
e por fim a saida que eu estou tendo
===== Teste do hibernate =====

Inserindo um registro
log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exibindo registros [ eu ]
Nome lido: eu Endereco lido: aqui
Atualizando um registro
Erro: [ could not insert: [Amigos#eu] ]

Alguém pode me ajudar?

Ele não deixa inserir um endereco atualizado no amigo eu... e por fim do banco não aparece absolutamente nada...

EDITADO
Ou melhor, porque ele não registra numa tabela InnoDB e soh em MySAM? mudei para MySAM e ele registrou os dados...
agora em InnoDB ele não registra!

Mas ele continua não inserindo depois do udpate, não atualiza o usuario.

DATABASE - MySQL 4.1

F

Deixe a tabela como InnoDB, inicie o controle de transação via código.

Transaction tx= session.beginTransaction();
....
tx.commit();

Como o InnoDB trabalha em transação, vc precisa iniciar o processo de controle na aplicação, estava funcionando com MyISAM pq este tipo de tabela não trabalha em transação.

[]'s

F

Existe tambem dois otimos artigos em Revistas Sobre Hibernate
:arrow: Hibernate, SQL nunca mais? O frameWork que veio pra simplificar de Fernando Boaglio (SQL Magazine 17)

:arrow: Hibernate Dicas e Truques, Por Sergio Umlauf e Caio Filipini Na Mundo Java 10

:arrow: Outro Lugar que eu adoro “fuçar” informações … http://groups-beta.google.com/groups?hl=en&q=Hibernate&qt_s=Search

R

Muito bom o artigo, parabéns.

W

errinho desgraçado…

tô usando hibernate com postgreSQL… e tenho esse código pra incrementar:

<generator class="native"/>

Já tentei outras coisas, como substituir o native, por NATIVE…

tentei também fazer o generator desse jeito:

<generator class="native"> iasdiajsd </generator>

Mas nada funciona… o erro é:

2007-03-06 17:12:02,703 WARN hibernate.util.JDBCExceptionReporter -> SQL Error: 0, SQLState: 42P01 2007-03-06 17:12:02,703 ERROR hibernate.util.JDBCExceptionReporter -> ERROR: relation "hibernate_sequence" does not exist Erro: could not get next sequence value

na verdade, ele insere o dado no meu banco, só que quando vai iserir o segundo, como ele acha a mesma chave, ele da´erro…

alguma sugestão?!

value povo…

:smiley:

F

Sei que esse tópico é um tanto quanto antigo mas tenho de postar minha opinião. A solução é ótima (pelo menos conceitualmente, digo isso pois ainda não tenho muita experiência em grandes projetos Java). Estou retomando os estudos e também a vivência com Java (inclusive nem lembrava mais que eu estava cadastrado no GUJ).

Recentemente trabalhei em um projeto onde migramos os SQLs de MySQL para Oracle. Imagino que utilizando Hibernate não teríamos de nos preocupar com migração, é isto mesmo? Quero iniciar alguns estudos inclusive com o conceito de Spatial DBs, alguém sabe se o Hibernate trabalha bem nestes casos?

[s]

C

oi, gente,

desculpem minha ignorância,mas pra q serve o RETRIEVE do amigoDAO?

P

olá odete,
RETRIEVE, seria a (e é) a recuperação de dados…

U
acho que este é oficialmente, o "morto vivo" mais teimoso do GUJ :D
M

Bom dia à todos, iniciei meus estudos com Hibernate, comecei a fazer o tutorial que está na documentação abaixo:
http://www.hibernate.org/hib_docs/v3/reference/en/html/
Fiz somente o primeiro exemplo, a única coisa que fiz diferente é que ao invés de utilizar o banco que eles indicam (HSQL), estou utiizando o postgre SQL 8.2,
Fiz tudo exatamente = ao tutorial, mudando somente para as configurações do postgres, tipo dialect, driver, senha usuario, etc.

Atualmente encontro este erro, no lugar onde faço estágio, tenho o mesmo ambiente instalado no estágio, na escola, e em casa.

HIBERNATE+JDK6+POSTGRESQL 8.2
Sendo que em casa e no estágio fui eu quem instalou e configurou tudo, e na escola já havia instalado o postgreSQL, ficando somente para eu configurar jdk6 + hibernate + eclipse.

Exception in thread “main” org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update

at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)

at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)

Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into event (date, title, id) values (2007-10-17 -03:00:00, My Event, 3) foi abortada. Chame getNextException para ver a causa.

at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2534)

at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1317)

Na escola funcionou perfeitamente, no estágio está dando este erro, acima descrito, sendo que o que faço é chegar importar o project no eclipse, configurar o CLASSPATH, e rodar.

Minha pergunta é seria alguma configuração na instalação do POSTGRE que quem instalou na escola instalou “mais corretamente”, ou é algum erro babaca que depois de 54646564 horas pesquisando achei somente algumas possíveis “soluções”, que também não funcionaram.

P

Boa noite, cara já faz algum tempo né q rolou isso com vc já achou a solução, porque estou no mesmo dilema.
Se acho o que vc fez estou precisando saber.
Abraço até mais.

marcoslopes:
Bom dia à todos, iniciei meus estudos com Hibernate, comecei a fazer o tutorial que está na documentação abaixo:
http://www.hibernate.org/hib_docs/v3/reference/en/html/
Fiz somente o primeiro exemplo, a única coisa que fiz diferente é que ao invés de utilizar o banco que eles indicam (HSQL), estou utiizando o postgre SQL 8.2,
Fiz tudo exatamente = ao tutorial, mudando somente para as configurações do postgres, tipo dialect, driver, senha usuario, etc.

Atualmente encontro este erro, no lugar onde faço estágio, tenho o mesmo ambiente instalado no estágio, na escola, e em casa.

HIBERNATE+JDK6+POSTGRESQL 8.2
Sendo que em casa e no estágio fui eu quem instalou e configurou tudo, e na escola já havia instalado o postgreSQL, ficando somente para eu configurar jdk6 + hibernate + eclipse.

Exception in thread “main” org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update

at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)

at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)

Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into event (date, title, id) values (2007-10-17 -03:00:00, My Event, 3) foi abortada. Chame getNextException para ver a causa.

at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2534)

at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1317)

Na escola funcionou perfeitamente, no estágio está dando este erro, acima descrito, sendo que o que faço é chegar importar o project no eclipse, configurar o CLASSPATH, e rodar.

Minha pergunta é seria alguma configuração na instalação do POSTGRE que quem instalou na escola instalou “mais corretamente”, ou é algum erro babaca que depois de 54646564 horas pesquisando achei somente algumas possíveis “soluções”, que também não funcionaram.

K

[size=18] meu… fiz um teste com hibernate a achei q ele perde em desempenho…
fazer sql é mto ruim mesmo, mas tb depende de como vc constrói seu código.

agora se quer mapear objetos como gente grande… nada melgor que “DB4O”
so não fiz testes com sistemas georeferenciados, mas é mto mais rapido que um banco relacional,
não precisa mapear como o hibernate e é muito simples de usar

http://www.db4o.com/[/size]

P

Vou dar uma olhada, mais quem manda é o patrão. hehe,
T+ e value

kdoigor:
[size=18] meu… fiz um teste com hibernate a achei q ele perde em desempenho…
fazer sql é mto ruim mesmo, mas tb depende de como vc constrói seu código.

agora se quer mapear objetos como gente grande… nada melgor que “DB4O”
so não fiz testes com sistemas georeferenciados, mas é mto mais rapido que um banco relacional,
não precisa mapear como o hibernate e é muito simples de usar

http://www.db4o.com/[/size]

T

Oi, tudo bom pessoal estou aprendendo hibernate não faz muito tempo e estou com algumas dificuldades em relação ao mapeamento many-to-many. Peguei um exemplo de uma apostila mas não estou conseguindo, quando eu arrumo um erro aparece uns quinze. Ollhai o código.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="beans.curso"  table="Curso">
        <id name="id_curso" column="id_curso" type="int">
            <generator class="increment"/>
        </id>

        
        <property name="codigo"/>
        <property name="nome"/>
        <property name="sigla"/>
           
      <!-- Mapeamento dos departamentos-->
      <set name="departamento" table="departamento_curso">
             <key column="id_curso"/>
             <many-to-many column="id_departamento"
                        class="beans.departamento"/>
      </set>
    </class>
</hibernate-mapping>

Lá vai o outro mapeamento.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="beans.departamento"
           table="departamento" column="id_departamento" type="int">
        
        <id name="id_departamento" >
        
        <generator class="increment"/>       
        
        </id>
        <property name="nome"/>
        <property name="sigla"/>
        
       <!-- Mapeamento dos cursos -->
       <set name="curso" table="departamento_curso"
             inverse="true">
             <key column="id_departamento"/>
             <many-to-many column="id_curso"
                    class="beans.curso"/>
       </set>
    </class>
</hibernate-mapping>

[code]


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="beans.departamento"
           table="departamento" column="id_departamento" type="int">
        
        <id name="id_departamento" >
        
        <generator class="increment"/>       
        
        </id>
        <property name="nome"/>
        <property name="sigla"/>
        
       <!-- Mapeamento dos cursos -->
       <set name="curso" table="departamento_curso"
             inverse="true">
             <key column="id_departamento"/>
             <many-to-many column="id_curso"
                    class="beans.curso"/>
       </set>
    </class>
</hibernate-mapping>
Pessoal, eu não sei se está certa a minha classe teste, já que estou usando increment para gerar a chave primária, e se estiver errado como seria a maneira certa. Olha a minha classe teste.
package teste;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import persistence.PersistenceConstants;
import beans.curso;
import beans.departamento;
//import beans.departamento_curso;



public class TesteCurso {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		departamento departamento = new departamento();

		departamento.setId_departamento(1);
		departamento.setNome("Thiago");
		departamento.setCentro("UFRA");
		
		curso curso = new curso();
        curso.setId_curso(172);
		curso.setCodigo(1);
		curso.setNome("joão");
		curso.setSigla("vto");
		
		/*
		departamento_curso x = new departamento_curso();
		x.getId_curso();
		x.getId_departamento();
		*/

		
		Configuration configuration = new Configuration();//.addClass(Login.class);
		Properties mainProperties = new Properties();
		FileInputStream fileInputStream;
		try {
			fileInputStream = new FileInputStream( PersistenceConstants.HIBERNATE_PROPERTIES );
			
			mainProperties.load( fileInputStream );
			
			configuration.addInputStream( new FileInputStream( PersistenceConstants.CURSO_BEAN_MAPPING ) );
			configuration.addInputStream( new FileInputStream( PersistenceConstants.DEPARTAMENTO_BEAN_MAPPING) );
		
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		configuration.setProperties( mainProperties );
				
		SessionFactory sf = configuration.buildSessionFactory();
		
		Session sess = sf.openSession();
		
		Transaction t = sess.beginTransaction();
		sess.save(departamento);
		t.commit();
		sess.close();
			

	}

}

E essa é minha persistence

/* Created at 21/10/2005 */

package persistence;
import java.io.File;

public class PersistenceConstants {

	/** The path to configuration directory files */
	private static final String CONF_DIR = "dbConf";
	
	/** The path to object relational mapping directory files */
	private static final String ORM_DIR = "dbOrm";
	
	/** The default file separator */
	private static final String SEP = File.separator;
	
	public static final String HIBERNATE_PROPERTIES = CONF_DIR + SEP + "hibernate.properties";
	
	public static final String CURSO_BEAN_MAPPING = ORM_DIR + SEP + "curso.hbm.xml";
	
	public static final String DEPARTAMENTO_BEAN_MAPPING = ORM_DIR + SEP + "departamento.hbm.xml";

}
A

O Hibernate faz a conversão de Banco para OO [url]?

L

Não se deve esquecer que o SQL é o responsável por executar efetivamente todos os comandos em um banco de dados, mesmo que haja um framework em sua aplicação. As implementações do Hibernate tem a teoria relacional como base (ele montou uma estrutura OO, com base na teoria relacional, destarte, ela não deixa de existir, muito pelo contrário, é o motivo pelo qual se criou o Hibernate [gerar uma interface entre uma estrutura relacional e uma estrutura OO] ).
A Hibernate é um framework extraordinário, com o HQL é possível deixar de pensar em uma estrutura relacional e pensar somente em objetos. Mas o SQL possui um escopo muito mais amplo do que o Hbernate. Para que fosse criado o SQL teorias concretas da matemática foram estudadas (e são até hoje) [contudo, infelizmente o SQL não respeita suas bases completamente, leiam o artigo The Third Manifesto para maiores informações].
Bom, haveria muito o que dizer sobre o SQL (não limitando-se a elogios) e a estrutura relacional. No entanto, só é primordial afirmar que o Hibernate ajuda o programador a limitar seu escopo de conhecimento a uma única forma de pensar (isso pode não ser ruim dependendo do caso), tornando assim a linha de aprendizagem e tempo para começar a produzir se tornarem mais próximas. Mas saber comandos SQL e onde utiliza-los é fundamental para um programador que tenha o mínimo de conhecimento.
A única infelicidade do artigo citado foi realmente colocar o SQL como vilão e não como razão.
E ainda afirmo sem medo que nada eliminará o SQL, somente o melhorará. Ferramentas que geram códigos automaticamente não os elimina, somente faz com que a vida de alguém se torne mais fácil. :slight_smile:

Sem mais.

Q

mais um ressuscitando tópico de 2003.

L

Uhn… O que você escreve tem prazo de validade?
Todo texto é válido, só depende da sua necessidade.
:slight_smile:

A

lucasvenez:
Uhn… O que você escreve tem prazo de validade?
Todo texto é válido, só depende da sua necessidade.
:)

Resposta tao elegante qto uma ligaçao leve… 8)

B

O artigo está muito bom, uma boa organização e de fácil entendimento.

Bom trabalho.

N

Como que eu faço para fazer uma pesquisa???

Estou fazendo:

public java.util.List getList&#40;String condicao&#41; throws Exception &#123;
	Session session = factory.openSession&#40;&#41;;
	List meses = session.find&#40;condicao&#41;;
	session.flush&#40;&#41;;
	session.close&#40;&#41;;
	return meses;
&#125;

E estou chamando:

lista = mesesDAO.getList&#40;"SELECT mes FROM meses WHERE mes = 01"&#41;;

Acho que vi em outro post que a query do Hibernate é diferente.

O Hibernator, plugin para o eclipse, faz essas querys??
E como eu posso fazer esse ex. funcionar??

Criado 15 de maio de 2003
Ultima resposta 20 de out. de 2003
Respostas 125
Participantes 63